Sample program showing how to connect GR-PEACH into Watson IoT through mbed Connector and Watson's Connector Bridge

Dependencies:   AsciiFont DisplayApp GR-PEACH_video LCD_shield_config LWIPBP3595Interface_STA_for_mbed-os USBDevice

Overview

This sample program shows how to connect GR-PEACH into Watson IoT through mbed Connector and Watson's Connector Bridge. Note that this program is derived from https://github.com/ARMmbed/mbed-ethernet-sample-techcon2016.

In this program, at first, the barcode data input from camera is decoded on GR-PEACH using ZXing which is an open-source, multi-format 1D/2D barcode image processing library. Then, the decoded string is sent to Watson IoT via mbed Device Connector and Watson's Connector Bridge. At last, the delivered string is confirmed via NodeRED flow.

Required hardware

Application setup

  1. Select the connection type. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Connection-type.
  2. Set the client credentials. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Client-credentials.
  3. Change Ethernet settings. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Ethernet-settings.
  4. Change Wifi settings. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Wifi-settings.

Building this sample program

  1. Import this sample program onto mbed Compiler.
  2. Configure this sample program in accordance with Application setup.
  3. Compile the example on mbed Compiler and download the resultant binary file.
  4. Plug the Ethernet cable into GR-PEACH if you are using Ethernet mode. /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen7.png
  5. Plug the micro-USB cable into the OpenSDA port with lies on the next to the RESET button.
  6. Copy the binary previously downloaded to your PC to GR-PEACH to flash this sample program. When the copy is successfully completed, the board is ready to work.
  7. Press the RESET button on the board to run this sample program.
  8. For verification, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Monitoring-the-application.

Application resources

This sample program exposes two resources listed below:

  1. /311/0/5850 : Trigger to toggle LED on GR-PEACH (PUT). When "1" is sent to this resource by PUT method, LED should be turned off. Otherwise, LED should be turned on.
  2. /888/0/7700: Decode result of barcode data input from camera (GET)

Setup of Watson IoT

  1. You should create Watson IoT Instance by the following procedure:
    • Login IBM Bluemix from https://console.ng.bluemix.net/ and login it.
    • Select Services as follows: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen6.png
    • Select Internet of Things" as follows: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen7_1.png
    • Press Get Started as follows: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen8.png
    • Configure Watson IoT Instance
      • Leave unbound /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen9.png
      • Select the Free plan, then click Create /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen10.png

  2. You should create Watson IoT Application Credentials Once you successfully create Watson IoT Instance, you should see the following Watson IoT dashboard: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen11.png
    • On dashboard, launch the Connect your devices dashboard /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen12.png
    • Click APPS /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen13.png
    • Click Generate API Key /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen14_1.png
    • Record the API Key and Authenticatoin Token. Then click Generate after adding a comment /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen15.png Note that these two values will be needed in the later step.
  3. Watson IoT NodeRED Application should be created in accordance with the following procedure:
    • Go back to your Bluemix Dashboard: https://console.ng.bluemix.net
    • Click Create Application /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen16.png
    • Select Node-RED Starter /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen17.png
    • Enter a unique App name and Click Create /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen18.png
    • Application will Stage after a few minutes
    • Application will report app is running when the staging has completed
  4. Watson NodeRED Application should be binded to Watson IoT instance
    • You can now see the dashboard below: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen19.png
    • Click Connections. Then, press Connect Existing /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen20.png
    • Click on Watson IoT Instance badge. Then, press Connect /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen21.png
    • NodeRED application will restage. This will take a while. Please wait for Your app is running state /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen22.png /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen23.png
  5. You should acquire mbed Device Connector DOMAIN value
    • Go to the mbed Device Connector Dashboard: https://connector.mbed.com and log in /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen41.png
    • Select Access Key in order to create a new token /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen42.png
    • Click CREATE NEW ACCESS KEY and enter a unique name. Then, push ADD bution /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen43.png
    • an API token is generated. Need to save the generated string for later steps /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen44.png
  1. You should configure Watson IoT ARM mbed Connector Bridge
    • Go back to the Watson IoT Dashboard and select Extensions /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen24.png
    • Press Add Extension /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen25.png
    • Add ARM mbed Connector /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen26_1.png
    • Setup the bridge /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen27.png
    • Enter your Connector API Token to Access Key and MBED_DOMAIN to Domain Id, respectively. Then, click Check Connection /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen28.png
    • If the connection is successfully established, you can see Connection Established. Then, press Done /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen29.png
  2. NodeRED Flow Example should be imported
    • Open NODEFLOW_GR-PEACH.txt
    • Navigate to the URL that you recorded earlier for your Watson IoT NodeRED Application (i.e. http://<app name>.mybluemix.net) and Select Go to your NodeRED flow editor /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen30.png
    • Select menu, Import and Clipboard /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen31.png
    • Paste the entire contents of JSON code described in NODEFLOW_GR-PEACH.txt and click Import /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen32.png
  3. Watson IoT Application Node Flow should be configured
    • Double-click input node and link them to your Watson IoT instance. /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen33.png
    • Click on the edit button /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen34.png
    • First enter arbitrary name. Then, Watson API Key and Watson Auth Token previously acquired. Finally, press Add to save /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen35.png
    • Enter MBED_ENDPOINT_NAME in security.h as Device ID. Then, press Done to save /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen36.png
    • Double-click output node /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen37.png
    • Edit API Key and Device Id in the same manner as that for input node
    • Click LED OFF and LED ON node and replace MBED_ENDPOINT_NAME_GOES_HERE with MBED_ENDPOINT_NAME as shown below: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen38.png
    • Click Deproy to deploy NodeRED application /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen39.png
  4. Invoke sample program
    • Press the reset button on GR-PEACH
    • The decode result of barcode data should be shown in debug window /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen40_1.png
    • Also, you can toggle LED by clicking Turn LED OFF and Turn LED ON injection node /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen40_2.png
Committer:
Osamu Nakamura
Date:
Thu Nov 24 13:59:16 2016 +0900
Revision:
0:ad834d403a8c
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:ad834d403a8c 1 /**
Osamu Nakamura 0:ad834d403a8c 2 * @file ZXingResource.h
Osamu Nakamura 0:ad834d403a8c 3 * @brief mbed CoAP Endpoint Accelerometer sensor resource supporting CoAP GET
Osamu Nakamura 0:ad834d403a8c 4 * @author Doug Anson
Osamu Nakamura 0:ad834d403a8c 5 * @version 1.0
Osamu Nakamura 0:ad834d403a8c 6 * @see
Osamu Nakamura 0:ad834d403a8c 7 *
Osamu Nakamura 0:ad834d403a8c 8 * Copyright (c) 2014
Osamu Nakamura 0:ad834d403a8c 9 *
Osamu Nakamura 0:ad834d403a8c 10 * Licensed under the Apache License, Version 2.0 (the "License");
Osamu Nakamura 0:ad834d403a8c 11 * you may not use this file except in compliance with the License.
Osamu Nakamura 0:ad834d403a8c 12 * You may obtain a copy of the License at
Osamu Nakamura 0:ad834d403a8c 13 *
Osamu Nakamura 0:ad834d403a8c 14 * http://www.apache.org/licenses/LICENSE-2.0
Osamu Nakamura 0:ad834d403a8c 15 *
Osamu Nakamura 0:ad834d403a8c 16 * Unless required by applicable law or agreed to in writing, software
Osamu Nakamura 0:ad834d403a8c 17 * distributed under the License is distributed on an "AS IS" BASIS,
Osamu Nakamura 0:ad834d403a8c 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Osamu Nakamura 0:ad834d403a8c 19 * See the License for the specific language governing permissions and
Osamu Nakamura 0:ad834d403a8c 20 * limitations under the License.
Osamu Nakamura 0:ad834d403a8c 21 */
Osamu Nakamura 0:ad834d403a8c 22
Osamu Nakamura 0:ad834d403a8c 23 #ifndef __ZXING_RESOURCE_H__
Osamu Nakamura 0:ad834d403a8c 24 #define __ZXING_RESOURCE_H__
Osamu Nakamura 0:ad834d403a8c 25
Osamu Nakamura 0:ad834d403a8c 26 // Base class
Osamu Nakamura 0:ad834d403a8c 27 #include "mbed-connector-interface/DynamicResource.h"
Osamu Nakamura 0:ad834d403a8c 28
Osamu Nakamura 0:ad834d403a8c 29 #include "DisplayBace.h"
Osamu Nakamura 0:ad834d403a8c 30 #include "ImageReaderSource.h"
Osamu Nakamura 0:ad834d403a8c 31 #include "DisplayApp.h"
Osamu Nakamura 0:ad834d403a8c 32 #include "AsciiFont.h"
Osamu Nakamura 0:ad834d403a8c 33
Osamu Nakamura 0:ad834d403a8c 34 // forward declarations
Osamu Nakamura 0:ad834d403a8c 35 static void *_instance = NULL;
Osamu Nakamura 0:ad834d403a8c 36 extern "C" void _zxing_processing(const void *args);
Osamu Nakamura 0:ad834d403a8c 37 extern "C" void _zxing_loop(void);
Osamu Nakamura 0:ad834d403a8c 38
Osamu Nakamura 0:ad834d403a8c 39 #define VIDEO_CVBS (0) /* Analog Video Signal */
Osamu Nakamura 0:ad834d403a8c 40 #define VIDEO_CMOS_CAMERA (1) /* Digital Video Signal */
Osamu Nakamura 0:ad834d403a8c 41 #define VIDEO_RGB888 (1)
Osamu Nakamura 0:ad834d403a8c 42
Osamu Nakamura 0:ad834d403a8c 43 /**** User Selection *********/
Osamu Nakamura 0:ad834d403a8c 44 /** Camera setting **/
Osamu Nakamura 0:ad834d403a8c 45 #define VIDEO_INPUT_METHOD (VIDEO_CMOS_CAMERA) /* Select VIDEO_CVBS or VIDEO_CMOS_CAMERA */
Osamu Nakamura 0:ad834d403a8c 46 #define VIDEO_INPUT_FORMAT (VIDEO_RGB888) /* Select VIDEO_RGB888 */
Osamu Nakamura 0:ad834d403a8c 47 #define USE_VIDEO_CH (0) /* Select 0 or 1 If selecting VIDEO_CMOS_CAMERA, should be 0.) */
Osamu Nakamura 0:ad834d403a8c 48 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
Osamu Nakamura 0:ad834d403a8c 49 /** LCD setting **/
Osamu Nakamura 0:ad834d403a8c 50 #define LCD_ONOFF (1) /* Select 0(without LCD) or 1(with LCD) */
Osamu Nakamura 0:ad834d403a8c 51 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 52 #define LCD_TYPE (0) /* Select 0(4.3inch) or 1(7.1inch) */
Osamu Nakamura 0:ad834d403a8c 53 #endif
Osamu Nakamura 0:ad834d403a8c 54 /*****************************/
Osamu Nakamura 0:ad834d403a8c 55
Osamu Nakamura 0:ad834d403a8c 56 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 57 /** LCD shield config **/
Osamu Nakamura 0:ad834d403a8c 58 #if (LCD_TYPE == 0)
Osamu Nakamura 0:ad834d403a8c 59 #include "LCD_shield_config_4_3inch.h"
Osamu Nakamura 0:ad834d403a8c 60 #else
Osamu Nakamura 0:ad834d403a8c 61 #include "LCD_shield_config_7_1inch.h"
Osamu Nakamura 0:ad834d403a8c 62 #endif
Osamu Nakamura 0:ad834d403a8c 63 #endif
Osamu Nakamura 0:ad834d403a8c 64
Osamu Nakamura 0:ad834d403a8c 65 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
Osamu Nakamura 0:ad834d403a8c 66 /* video input */
Osamu Nakamura 0:ad834d403a8c 67 #if USE_VIDEO_CH == (0)
Osamu Nakamura 0:ad834d403a8c 68 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
Osamu Nakamura 0:ad834d403a8c 69 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
Osamu Nakamura 0:ad834d403a8c 70 #else
Osamu Nakamura 0:ad834d403a8c 71 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_1)
Osamu Nakamura 0:ad834d403a8c 72 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S1_VFIELD)
Osamu Nakamura 0:ad834d403a8c 73 #endif
Osamu Nakamura 0:ad834d403a8c 74
Osamu Nakamura 0:ad834d403a8c 75 /* NTSC or PAL */
Osamu Nakamura 0:ad834d403a8c 76 #if VIDEO_PAL == 0
Osamu Nakamura 0:ad834d403a8c 77 #define COL_SYS (DisplayBase::COL_SYS_NTSC_358)
Osamu Nakamura 0:ad834d403a8c 78 #else
Osamu Nakamura 0:ad834d403a8c 79 #define COL_SYS (DisplayBase::COL_SYS_PAL_443)
Osamu Nakamura 0:ad834d403a8c 80 #endif
Osamu Nakamura 0:ad834d403a8c 81
Osamu Nakamura 0:ad834d403a8c 82 /* Video input */
Osamu Nakamura 0:ad834d403a8c 83 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB888)
Osamu Nakamura 0:ad834d403a8c 84 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB888)
Osamu Nakamura 0:ad834d403a8c 85 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32BIT)
Osamu Nakamura 0:ad834d403a8c 86
Osamu Nakamura 0:ad834d403a8c 87 /* The size of the video input */
Osamu Nakamura 0:ad834d403a8c 88 #if ((LCD_ONOFF) && (LCD_TYPE == 0))
Osamu Nakamura 0:ad834d403a8c 89 #define VIDEO_PIXEL_HW LCD_PIXEL_WIDTH
Osamu Nakamura 0:ad834d403a8c 90 #define VIDEO_PIXEL_VW LCD_PIXEL_HEIGHT
Osamu Nakamura 0:ad834d403a8c 91 #else
Osamu Nakamura 0:ad834d403a8c 92 #define VIDEO_PIXEL_HW (640) /* VGA */
Osamu Nakamura 0:ad834d403a8c 93 #define VIDEO_PIXEL_VW (480) /* VGA */
Osamu Nakamura 0:ad834d403a8c 94 #endif
Osamu Nakamura 0:ad834d403a8c 95
Osamu Nakamura 0:ad834d403a8c 96 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
Osamu Nakamura 0:ad834d403a8c 97 in accordance with the frame buffer burst transfer mode. */
Osamu Nakamura 0:ad834d403a8c 98 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
Osamu Nakamura 0:ad834d403a8c 99 #define FRAME_BUFFER_NUM (2u)
Osamu Nakamura 0:ad834d403a8c 100 #define FRAME_BUFFER_BYTE_PER_PIXEL (4u)
Osamu Nakamura 0:ad834d403a8c 101 #define FRAME_BUFFER_STRIDE (((VIDEO_PIXEL_HW * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
Osamu Nakamura 0:ad834d403a8c 102
Osamu Nakamura 0:ad834d403a8c 103 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 104 #define VIDEO_PIXEL_HW_STR (VIDEO_PIXEL_HW - 64)
Osamu Nakamura 0:ad834d403a8c 105 #define VIDEO_PIXEL_VW_STR (VIDEO_PIXEL_VW - 64)
Osamu Nakamura 0:ad834d403a8c 106 #define FRAME_BUFFER_BYTE_PER_PIXEL_STR (2u)
Osamu Nakamura 0:ad834d403a8c 107 #define FRAME_BUFFER_STRIDE_STR (((VIDEO_PIXEL_HW_STR * FRAME_BUFFER_BYTE_PER_PIXEL_STR) + 31u) & ~31u)
Osamu Nakamura 0:ad834d403a8c 108 #endif
Osamu Nakamura 0:ad834d403a8c 109
Osamu Nakamura 0:ad834d403a8c 110 static DisplayBase Display;
Osamu Nakamura 0:ad834d403a8c 111 static DisplayApp display_app;
Osamu Nakamura 0:ad834d403a8c 112 static Timer decode_timer;
Osamu Nakamura 0:ad834d403a8c 113 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 114 static DigitalOut lcd_pwon(P7_15);
Osamu Nakamura 0:ad834d403a8c 115 static DigitalOut lcd_blon(P8_1);
Osamu Nakamura 0:ad834d403a8c 116 static PwmOut lcd_cntrst(P8_15);
Osamu Nakamura 0:ad834d403a8c 117 #endif
Osamu Nakamura 0:ad834d403a8c 118
Osamu Nakamura 0:ad834d403a8c 119 /* 32 bytes aligned */
Osamu Nakamura 0:ad834d403a8c 120 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW]__attribute((aligned(32)));
Osamu Nakamura 0:ad834d403a8c 121 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW]__attribute((aligned(32)));
Osamu Nakamura 0:ad834d403a8c 122 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 123 static uint8_t user_frame_buffer_string[FRAME_BUFFER_STRIDE_STR * VIDEO_PIXEL_VW_STR]__attribute((aligned(32)));
Osamu Nakamura 0:ad834d403a8c 124 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);
Osamu Nakamura 0:ad834d403a8c 125 static bool string_draw;
Osamu Nakamura 0:ad834d403a8c 126 #endif
Osamu Nakamura 0:ad834d403a8c 127 static uint8_t * decode_buffer = user_frame_buffer0;
Osamu Nakamura 0:ad834d403a8c 128 static uint8_t * FrameBufferTbl[FRAME_BUFFER_NUM] = {user_frame_buffer0, user_frame_buffer1};
Osamu Nakamura 0:ad834d403a8c 129 static volatile int32_t vfield_count = 0;
Osamu Nakamura 0:ad834d403a8c 130 static int write_buff_num = 0;
Osamu Nakamura 0:ad834d403a8c 131 static bool graphics_init_end = false;
Osamu Nakamura 0:ad834d403a8c 132 static int decode_wait_time = 0;
Osamu Nakamura 0:ad834d403a8c 133
Osamu Nakamura 0:ad834d403a8c 134 vector<Ref<Result> > results;
Osamu Nakamura 0:ad834d403a8c 135 char ** decode_str;
Osamu Nakamura 0:ad834d403a8c 136
Osamu Nakamura 0:ad834d403a8c 137 /****** cache control ******/
Osamu Nakamura 0:ad834d403a8c 138 static void dcache_clean(void * p_buf, uint32_t size) {
Osamu Nakamura 0:ad834d403a8c 139 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
Osamu Nakamura 0:ad834d403a8c 140 uint32_t end_addr = (uint32_t)p_buf + size;
Osamu Nakamura 0:ad834d403a8c 141 uint32_t addr;
Osamu Nakamura 0:ad834d403a8c 142
Osamu Nakamura 0:ad834d403a8c 143 /* Data cache clean */
Osamu Nakamura 0:ad834d403a8c 144 for (addr = start_addr; addr < end_addr; addr += 0x20) {
Osamu Nakamura 0:ad834d403a8c 145 __v7_clean_dcache_mva((void *)addr);
Osamu Nakamura 0:ad834d403a8c 146 }
Osamu Nakamura 0:ad834d403a8c 147 }
Osamu Nakamura 0:ad834d403a8c 148
Osamu Nakamura 0:ad834d403a8c 149 static void dcache_invalid(void * p_buf, uint32_t size){
Osamu Nakamura 0:ad834d403a8c 150 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
Osamu Nakamura 0:ad834d403a8c 151 uint32_t end_addr = (uint32_t)p_buf + size;
Osamu Nakamura 0:ad834d403a8c 152 uint32_t addr;
Osamu Nakamura 0:ad834d403a8c 153
Osamu Nakamura 0:ad834d403a8c 154 /* Data cache invalid */
Osamu Nakamura 0:ad834d403a8c 155 for (addr = start_addr; addr < end_addr; addr += 0x20) {
Osamu Nakamura 0:ad834d403a8c 156 __v7_inv_dcache_mva((void *)addr);
Osamu Nakamura 0:ad834d403a8c 157 }
Osamu Nakamura 0:ad834d403a8c 158 }
Osamu Nakamura 0:ad834d403a8c 159
Osamu Nakamura 0:ad834d403a8c 160 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 161 /****** LCD ******/
Osamu Nakamura 0:ad834d403a8c 162 static void Init_LCD_Display(void) {
Osamu Nakamura 0:ad834d403a8c 163 DisplayBase::graphics_error_t error;
Osamu Nakamura 0:ad834d403a8c 164 DisplayBase::lcd_config_t lcd_config;
Osamu Nakamura 0:ad834d403a8c 165 PinName lvds_pin[8] = {
Osamu Nakamura 0:ad834d403a8c 166 /* data pin */
Osamu Nakamura 0:ad834d403a8c 167 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
Osamu Nakamura 0:ad834d403a8c 168 };
Osamu Nakamura 0:ad834d403a8c 169
Osamu Nakamura 0:ad834d403a8c 170 lcd_pwon = 0;
Osamu Nakamura 0:ad834d403a8c 171 lcd_blon = 0;
Osamu Nakamura 0:ad834d403a8c 172 Thread::wait(100);
Osamu Nakamura 0:ad834d403a8c 173 lcd_pwon = 1;
Osamu Nakamura 0:ad834d403a8c 174 lcd_blon = 1;
Osamu Nakamura 0:ad834d403a8c 175
Osamu Nakamura 0:ad834d403a8c 176 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
Osamu Nakamura 0:ad834d403a8c 177
Osamu Nakamura 0:ad834d403a8c 178 /* Graphics initialization process */
Osamu Nakamura 0:ad834d403a8c 179 lcd_config = LcdCfgTbl_LCD_shield;
Osamu Nakamura 0:ad834d403a8c 180 error = Display.Graphics_init(&lcd_config);
Osamu Nakamura 0:ad834d403a8c 181 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 182 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 183 mbed_die();
Osamu Nakamura 0:ad834d403a8c 184 }
Osamu Nakamura 0:ad834d403a8c 185 graphics_init_end = true;
Osamu Nakamura 0:ad834d403a8c 186 }
Osamu Nakamura 0:ad834d403a8c 187
Osamu Nakamura 0:ad834d403a8c 188 static void Start_LCD_Display(uint8_t * p_buf) {
Osamu Nakamura 0:ad834d403a8c 189 DisplayBase::rect_t rect;
Osamu Nakamura 0:ad834d403a8c 190
Osamu Nakamura 0:ad834d403a8c 191 rect.vs = 0;
Osamu Nakamura 0:ad834d403a8c 192 rect.vw = VIDEO_PIXEL_VW;
Osamu Nakamura 0:ad834d403a8c 193 rect.hs = 0;
Osamu Nakamura 0:ad834d403a8c 194 rect.hw = VIDEO_PIXEL_HW;
Osamu Nakamura 0:ad834d403a8c 195 Display.Graphics_Read_Setting(
Osamu Nakamura 0:ad834d403a8c 196 DisplayBase::GRAPHICS_LAYER_0,
Osamu Nakamura 0:ad834d403a8c 197 (void *)p_buf,
Osamu Nakamura 0:ad834d403a8c 198 FRAME_BUFFER_STRIDE,
Osamu Nakamura 0:ad834d403a8c 199 GRAPHICS_FORMAT,
Osamu Nakamura 0:ad834d403a8c 200 WR_RD_WRSWA,
Osamu Nakamura 0:ad834d403a8c 201 &rect
Osamu Nakamura 0:ad834d403a8c 202 );
Osamu Nakamura 0:ad834d403a8c 203 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
Osamu Nakamura 0:ad834d403a8c 204 }
Osamu Nakamura 0:ad834d403a8c 205 #endif
Osamu Nakamura 0:ad834d403a8c 206
Osamu Nakamura 0:ad834d403a8c 207 /****** Video ******/
Osamu Nakamura 0:ad834d403a8c 208 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) {
Osamu Nakamura 0:ad834d403a8c 209 /* Interrupt callback function for Vfield interruption */
Osamu Nakamura 0:ad834d403a8c 210 if (vfield_count > 0) {
Osamu Nakamura 0:ad834d403a8c 211 vfield_count--;
Osamu Nakamura 0:ad834d403a8c 212 }
Osamu Nakamura 0:ad834d403a8c 213 }
Osamu Nakamura 0:ad834d403a8c 214
Osamu Nakamura 0:ad834d403a8c 215 static void Wait_Vfield(const int32_t wait_count) {
Osamu Nakamura 0:ad834d403a8c 216 /* Wait for the specified number of times Vsync occurs */
Osamu Nakamura 0:ad834d403a8c 217 vfield_count = wait_count;
Osamu Nakamura 0:ad834d403a8c 218 while (vfield_count > 0) {
Osamu Nakamura 0:ad834d403a8c 219 Thread::wait(1);
Osamu Nakamura 0:ad834d403a8c 220 }
Osamu Nakamura 0:ad834d403a8c 221 }
Osamu Nakamura 0:ad834d403a8c 222
Osamu Nakamura 0:ad834d403a8c 223 static void Init_Video(void) {
Osamu Nakamura 0:ad834d403a8c 224 DisplayBase::graphics_error_t error;
Osamu Nakamura 0:ad834d403a8c 225
Osamu Nakamura 0:ad834d403a8c 226 /* Graphics initialization process */
Osamu Nakamura 0:ad834d403a8c 227 if (graphics_init_end == false) {
Osamu Nakamura 0:ad834d403a8c 228 /* When not initializing LCD, this processing is needed. */
Osamu Nakamura 0:ad834d403a8c 229 error = Display.Graphics_init(NULL);
Osamu Nakamura 0:ad834d403a8c 230 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 231 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 232 mbed_die();
Osamu Nakamura 0:ad834d403a8c 233 }
Osamu Nakamura 0:ad834d403a8c 234 graphics_init_end = true;
Osamu Nakamura 0:ad834d403a8c 235 }
Osamu Nakamura 0:ad834d403a8c 236
Osamu Nakamura 0:ad834d403a8c 237 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
Osamu Nakamura 0:ad834d403a8c 238 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
Osamu Nakamura 0:ad834d403a8c 239 if( error != DisplayBase::GRAPHICS_OK ) {
Osamu Nakamura 0:ad834d403a8c 240 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 241 mbed_die();
Osamu Nakamura 0:ad834d403a8c 242 }
Osamu Nakamura 0:ad834d403a8c 243 #elif VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
Osamu Nakamura 0:ad834d403a8c 244 DisplayBase::video_ext_in_config_t ext_in_config;
Osamu Nakamura 0:ad834d403a8c 245 PinName cmos_camera_pin[11] = {
Osamu Nakamura 0:ad834d403a8c 246 /* data pin */
Osamu Nakamura 0:ad834d403a8c 247 P2_7, P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0,
Osamu Nakamura 0:ad834d403a8c 248 /* control pin */
Osamu Nakamura 0:ad834d403a8c 249 P10_0, /* DV0_CLK */
Osamu Nakamura 0:ad834d403a8c 250 P1_0, /* DV0_Vsync */
Osamu Nakamura 0:ad834d403a8c 251 P1_1 /* DV0_Hsync */
Osamu Nakamura 0:ad834d403a8c 252 };
Osamu Nakamura 0:ad834d403a8c 253
Osamu Nakamura 0:ad834d403a8c 254 /* MT9V111 camera input config */
Osamu Nakamura 0:ad834d403a8c 255 ext_in_config.inp_format = DisplayBase::VIDEO_EXTIN_FORMAT_BT601; /* BT601 8bit YCbCr format */
Osamu Nakamura 0:ad834d403a8c 256 ext_in_config.inp_pxd_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing data */
Osamu Nakamura 0:ad834d403a8c 257 ext_in_config.inp_vs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Vsync signals */
Osamu Nakamura 0:ad834d403a8c 258 ext_in_config.inp_hs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Hsync signals */
Osamu Nakamura 0:ad834d403a8c 259 ext_in_config.inp_endian_on = DisplayBase::OFF; /* External input bit endian change on/off */
Osamu Nakamura 0:ad834d403a8c 260 ext_in_config.inp_swap_on = DisplayBase::OFF; /* External input B/R signal swap on/off */
Osamu Nakamura 0:ad834d403a8c 261 ext_in_config.inp_vs_inv = DisplayBase::SIG_POL_NOT_INVERTED; /* External input DV_VSYNC inversion control */
Osamu Nakamura 0:ad834d403a8c 262 ext_in_config.inp_hs_inv = DisplayBase::SIG_POL_INVERTED; /* External input DV_HSYNC inversion control */
Osamu Nakamura 0:ad834d403a8c 263 ext_in_config.inp_f525_625 = DisplayBase::EXTIN_LINE_525; /* Number of lines for BT.656 external input */
Osamu Nakamura 0:ad834d403a8c 264 ext_in_config.inp_h_pos = DisplayBase::EXTIN_H_POS_CRYCBY; /* Y/Cb/Y/Cr data string start timing to Hsync reference */
Osamu Nakamura 0:ad834d403a8c 265 ext_in_config.cap_vs_pos = 6; /* Capture start position from Vsync */
Osamu Nakamura 0:ad834d403a8c 266 ext_in_config.cap_hs_pos = 150; /* Capture start position form Hsync */
Osamu Nakamura 0:ad834d403a8c 267 #if ((LCD_ONOFF) && (LCD_TYPE == 0))
Osamu Nakamura 0:ad834d403a8c 268 /* The same screen ratio as the screen ratio of the LCD. */
Osamu Nakamura 0:ad834d403a8c 269 ext_in_config.cap_width = 640; /* Capture width */
Osamu Nakamura 0:ad834d403a8c 270 ext_in_config.cap_height = 363; /* Capture height Max 468[line]
Osamu Nakamura 0:ad834d403a8c 271 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
Osamu Nakamura 0:ad834d403a8c 272 #else
Osamu Nakamura 0:ad834d403a8c 273 ext_in_config.cap_width = 640; /* Capture width */
Osamu Nakamura 0:ad834d403a8c 274 ext_in_config.cap_height = 468; /* Capture height Max 468[line]
Osamu Nakamura 0:ad834d403a8c 275 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
Osamu Nakamura 0:ad834d403a8c 276 #endif
Osamu Nakamura 0:ad834d403a8c 277 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_EXT, &ext_in_config);
Osamu Nakamura 0:ad834d403a8c 278 if( error != DisplayBase::GRAPHICS_OK ) {
Osamu Nakamura 0:ad834d403a8c 279 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 280 mbed_die();
Osamu Nakamura 0:ad834d403a8c 281 }
Osamu Nakamura 0:ad834d403a8c 282
Osamu Nakamura 0:ad834d403a8c 283 /* Camera input port setting */
Osamu Nakamura 0:ad834d403a8c 284 error = Display.Graphics_Dvinput_Port_Init(cmos_camera_pin, 11);
Osamu Nakamura 0:ad834d403a8c 285 if( error != DisplayBase::GRAPHICS_OK ) {
Osamu Nakamura 0:ad834d403a8c 286 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 287 mbed_die();
Osamu Nakamura 0:ad834d403a8c 288 }
Osamu Nakamura 0:ad834d403a8c 289 #endif
Osamu Nakamura 0:ad834d403a8c 290
Osamu Nakamura 0:ad834d403a8c 291 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
Osamu Nakamura 0:ad834d403a8c 292 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
Osamu Nakamura 0:ad834d403a8c 293 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 294 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 295 mbed_die();
Osamu Nakamura 0:ad834d403a8c 296 }
Osamu Nakamura 0:ad834d403a8c 297 }
Osamu Nakamura 0:ad834d403a8c 298
Osamu Nakamura 0:ad834d403a8c 299 static void Start_Video(uint8_t * p_buf) {
Osamu Nakamura 0:ad834d403a8c 300 DisplayBase::graphics_error_t error;
Osamu Nakamura 0:ad834d403a8c 301
Osamu Nakamura 0:ad834d403a8c 302 /* Video capture setting (progressive form fixed) */
Osamu Nakamura 0:ad834d403a8c 303 error = Display.Video_Write_Setting(
Osamu Nakamura 0:ad834d403a8c 304 VIDEO_INPUT_CH,
Osamu Nakamura 0:ad834d403a8c 305 COL_SYS,
Osamu Nakamura 0:ad834d403a8c 306 p_buf,
Osamu Nakamura 0:ad834d403a8c 307 FRAME_BUFFER_STRIDE,
Osamu Nakamura 0:ad834d403a8c 308 VIDEO_FORMAT,
Osamu Nakamura 0:ad834d403a8c 309 WR_RD_WRSWA,
Osamu Nakamura 0:ad834d403a8c 310 VIDEO_PIXEL_VW,
Osamu Nakamura 0:ad834d403a8c 311 VIDEO_PIXEL_HW
Osamu Nakamura 0:ad834d403a8c 312 );
Osamu Nakamura 0:ad834d403a8c 313 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 314 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 315 mbed_die();
Osamu Nakamura 0:ad834d403a8c 316 }
Osamu Nakamura 0:ad834d403a8c 317
Osamu Nakamura 0:ad834d403a8c 318 /* Video write process start */
Osamu Nakamura 0:ad834d403a8c 319 error = Display.Video_Start(VIDEO_INPUT_CH);
Osamu Nakamura 0:ad834d403a8c 320 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 321 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 322 mbed_die();
Osamu Nakamura 0:ad834d403a8c 323 }
Osamu Nakamura 0:ad834d403a8c 324
Osamu Nakamura 0:ad834d403a8c 325 /* Video write process stop */
Osamu Nakamura 0:ad834d403a8c 326 error = Display.Video_Stop(VIDEO_INPUT_CH);
Osamu Nakamura 0:ad834d403a8c 327 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 328 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 329 mbed_die();
Osamu Nakamura 0:ad834d403a8c 330 }
Osamu Nakamura 0:ad834d403a8c 331
Osamu Nakamura 0:ad834d403a8c 332 /* Video write process start */
Osamu Nakamura 0:ad834d403a8c 333 error = Display.Video_Start(VIDEO_INPUT_CH);
Osamu Nakamura 0:ad834d403a8c 334 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 335 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 336 mbed_die();
Osamu Nakamura 0:ad834d403a8c 337 }
Osamu Nakamura 0:ad834d403a8c 338 }
Osamu Nakamura 0:ad834d403a8c 339
Osamu Nakamura 0:ad834d403a8c 340 /**
Osamu Nakamura 0:ad834d403a8c 341 * ZXingResource class
Osamu Nakamura 0:ad834d403a8c 342 */
Osamu Nakamura 0:ad834d403a8c 343 class ZXingResource : public DynamicResource
Osamu Nakamura 0:ad834d403a8c 344 {
Osamu Nakamura 0:ad834d403a8c 345 private:
Osamu Nakamura 0:ad834d403a8c 346 Thread * m_zxing_processor;
Osamu Nakamura 0:ad834d403a8c 347
Osamu Nakamura 0:ad834d403a8c 348 public:
Osamu Nakamura 0:ad834d403a8c 349 /**
Osamu Nakamura 0:ad834d403a8c 350 Default constructor
Osamu Nakamura 0:ad834d403a8c 351 @param logger input logger instance for this resource
Osamu Nakamura 0:ad834d403a8c 352 @param obj_name input the Accelerometer Object name
Osamu Nakamura 0:ad834d403a8c 353 @param res_name input the Accelerometer Resource name
Osamu Nakamura 0:ad834d403a8c 354 @param observable input the resource is Observable (default: FALSE)
Osamu Nakamura 0:ad834d403a8c 355 */
Osamu Nakamura 0:ad834d403a8c 356
Osamu Nakamura 0:ad834d403a8c 357 ZXingResource(const Logger *logger,const char *obj_name,const char *res_name,const bool observable = false) : DynamicResource(logger,obj_name,res_name,"ZXing",M2MBase::GET_ALLOWED,observable) {
Osamu Nakamura 0:ad834d403a8c 358 // init
Osamu Nakamura 0:ad834d403a8c 359 _instance = (void *)this;
Osamu Nakamura 0:ad834d403a8c 360
Osamu Nakamura 0:ad834d403a8c 361 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 362 // Initialze LCD
Osamu Nakamura 0:ad834d403a8c 363 Init_LCD_Display();
Osamu Nakamura 0:ad834d403a8c 364 #endif
Osamu Nakamura 0:ad834d403a8c 365 // Initialize Video
Osamu Nakamura 0:ad834d403a8c 366 Init_Video();
Osamu Nakamura 0:ad834d403a8c 367
Osamu Nakamura 0:ad834d403a8c 368 // Initialize frame buffer
Osamu Nakamura 0:ad834d403a8c 369 for (int i = 0; i < FRAME_BUFFER_NUM; i++) {
Osamu Nakamura 0:ad834d403a8c 370 memset(FrameBufferTbl[i], 0, (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW));
Osamu Nakamura 0:ad834d403a8c 371 dcache_clean(FrameBufferTbl[i], (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW));
Osamu Nakamura 0:ad834d403a8c 372 }
Osamu Nakamura 0:ad834d403a8c 373
Osamu Nakamura 0:ad834d403a8c 374 // Start Video
Osamu Nakamura 0:ad834d403a8c 375 Start_Video(FrameBufferTbl[write_buff_num]);
Osamu Nakamura 0:ad834d403a8c 376 /* Wait for first video drawing */
Osamu Nakamura 0:ad834d403a8c 377 Wait_Vfield(2);
Osamu Nakamura 0:ad834d403a8c 378
Osamu Nakamura 0:ad834d403a8c 379 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 380 DisplayBase::rect_t rect;
Osamu Nakamura 0:ad834d403a8c 381
Osamu Nakamura 0:ad834d403a8c 382 /* The layer by which the touch panel location is drawn */
Osamu Nakamura 0:ad834d403a8c 383 ascii_font.Erase(0x00000000); /* rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red */
Osamu Nakamura 0:ad834d403a8c 384 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
Osamu Nakamura 0:ad834d403a8c 385 rect.vs = 32;
Osamu Nakamura 0:ad834d403a8c 386 rect.vw = VIDEO_PIXEL_VW_STR;
Osamu Nakamura 0:ad834d403a8c 387 rect.hs = 32;
Osamu Nakamura 0:ad834d403a8c 388 rect.hw = VIDEO_PIXEL_HW_STR;
Osamu Nakamura 0:ad834d403a8c 389 Display.Graphics_Read_Setting(
Osamu Nakamura 0:ad834d403a8c 390 DisplayBase::GRAPHICS_LAYER_1,
Osamu Nakamura 0:ad834d403a8c 391 (void *)user_frame_buffer_string,
Osamu Nakamura 0:ad834d403a8c 392 FRAME_BUFFER_STRIDE_STR,
Osamu Nakamura 0:ad834d403a8c 393 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
Osamu Nakamura 0:ad834d403a8c 394 DisplayBase::WR_RD_WRSWA_32_16BIT,
Osamu Nakamura 0:ad834d403a8c 395 &rect
Osamu Nakamura 0:ad834d403a8c 396 );
Osamu Nakamura 0:ad834d403a8c 397 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_1);
Osamu Nakamura 0:ad834d403a8c 398 string_draw = false;
Osamu Nakamura 0:ad834d403a8c 399 /* Start of LCD */
Osamu Nakamura 0:ad834d403a8c 400 Start_LCD_Display(FrameBufferTbl[write_buff_num]);
Osamu Nakamura 0:ad834d403a8c 401 /* Backlight on */
Osamu Nakamura 0:ad834d403a8c 402 Thread::wait(200);
Osamu Nakamura 0:ad834d403a8c 403 lcd_cntrst.write(1.0);
Osamu Nakamura 0:ad834d403a8c 404 #endif
Osamu Nakamura 0:ad834d403a8c 405 decode_timer.reset();
Osamu Nakamura 0:ad834d403a8c 406 decode_timer.start();
Osamu Nakamura 0:ad834d403a8c 407
Osamu Nakamura 0:ad834d403a8c 408 // no Thread yet
Osamu Nakamura 0:ad834d403a8c 409 this->m_zxing_processor = NULL;
Osamu Nakamura 0:ad834d403a8c 410 }
Osamu Nakamura 0:ad834d403a8c 411
Osamu Nakamura 0:ad834d403a8c 412 /**
Osamu Nakamura 0:ad834d403a8c 413 Get the value of the barcode data
Osamu Nakamura 0:ad834d403a8c 414 @returns string containing the acclerometer sensor value
Osamu Nakamura 0:ad834d403a8c 415 */
Osamu Nakamura 0:ad834d403a8c 416 virtual string get() {
Osamu Nakamura 0:ad834d403a8c 417 #if 1
Osamu Nakamura 0:ad834d403a8c 418 if (this->m_zxing_processor == NULL) {
Osamu Nakamura 0:ad834d403a8c 419 // create the processing thread
Osamu Nakamura 0:ad834d403a8c 420 this->m_zxing_processor = new Thread(_zxing_processing);
Osamu Nakamura 0:ad834d403a8c 421 }
Osamu Nakamura 0:ad834d403a8c 422
Osamu Nakamura 0:ad834d403a8c 423 if (*decode_str == NULL) {
Osamu Nakamura 0:ad834d403a8c 424 return string("0\0");
Osamu Nakamura 0:ad834d403a8c 425 } else {
Osamu Nakamura 0:ad834d403a8c 426 return string(*decode_str);
Osamu Nakamura 0:ad834d403a8c 427 }
Osamu Nakamura 0:ad834d403a8c 428
Osamu Nakamura 0:ad834d403a8c 429 #endif
Osamu Nakamura 0:ad834d403a8c 430 }
Osamu Nakamura 0:ad834d403a8c 431 };
Osamu Nakamura 0:ad834d403a8c 432
Osamu Nakamura 0:ad834d403a8c 433 void _zxing_processing(const void *args) {
Osamu Nakamura 0:ad834d403a8c 434 while (true) {
Osamu Nakamura 0:ad834d403a8c 435 _zxing_loop();
Osamu Nakamura 0:ad834d403a8c 436 Thread::wait(5);
Osamu Nakamura 0:ad834d403a8c 437 }
Osamu Nakamura 0:ad834d403a8c 438 }
Osamu Nakamura 0:ad834d403a8c 439
Osamu Nakamura 0:ad834d403a8c 440 void _zxing_loop(void) {
Osamu Nakamura 0:ad834d403a8c 441 DisplayBase::graphics_error_t error;
Osamu Nakamura 0:ad834d403a8c 442 int decode_result = -1;
Osamu Nakamura 0:ad834d403a8c 443
Osamu Nakamura 0:ad834d403a8c 444 #if 1
Osamu Nakamura 0:ad834d403a8c 445 decode_buffer = FrameBufferTbl[write_buff_num];
Osamu Nakamura 0:ad834d403a8c 446 write_buff_num++;
Osamu Nakamura 0:ad834d403a8c 447
Osamu Nakamura 0:ad834d403a8c 448 if (write_buff_num >= FRAME_BUFFER_NUM) {
Osamu Nakamura 0:ad834d403a8c 449 write_buff_num = 0;
Osamu Nakamura 0:ad834d403a8c 450 }
Osamu Nakamura 0:ad834d403a8c 451 /* Change video buffer */
Osamu Nakamura 0:ad834d403a8c 452 error = Display.Video_Write_Change(VIDEO_INPUT_CH, FrameBufferTbl[write_buff_num], FRAME_BUFFER_STRIDE);
Osamu Nakamura 0:ad834d403a8c 453 if (error != DisplayBase::GRAPHICS_OK) {
Osamu Nakamura 0:ad834d403a8c 454 printf("Line %d, error %d\n", __LINE__, error);
Osamu Nakamura 0:ad834d403a8c 455 mbed_die();
Osamu Nakamura 0:ad834d403a8c 456 }
Osamu Nakamura 0:ad834d403a8c 457 Wait_Vfield(2);
Osamu Nakamura 0:ad834d403a8c 458 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 459 /* Change LCD buffer */
Osamu Nakamura 0:ad834d403a8c 460 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0, (void *)FrameBufferTbl[write_buff_num]);
Osamu Nakamura 0:ad834d403a8c 461 #endif
Osamu Nakamura 0:ad834d403a8c 462 dcache_invalid(decode_buffer, (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW));
Osamu Nakamura 0:ad834d403a8c 463 /* Decode barcode image */
Osamu Nakamura 0:ad834d403a8c 464 if (decode_timer.read_ms() >= decode_wait_time) {
Osamu Nakamura 0:ad834d403a8c 465 decode_timer.reset();
Osamu Nakamura 0:ad834d403a8c 466 decode_result = ex_decode(decode_buffer, (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW), VIDEO_PIXEL_HW, VIDEO_PIXEL_VW, &results);
Osamu Nakamura 0:ad834d403a8c 467 if (decode_result == 0) {
Osamu Nakamura 0:ad834d403a8c 468 decode_str = (char **)&(results[0]->getText()->getText());
Osamu Nakamura 0:ad834d403a8c 469
Osamu Nakamura 0:ad834d403a8c 470 if (_instance != NULL) {
Osamu Nakamura 0:ad834d403a8c 471 // observe...
Osamu Nakamura 0:ad834d403a8c 472 ((ZXingResource *)_instance)->observe();
Osamu Nakamura 0:ad834d403a8c 473 }
Osamu Nakamura 0:ad834d403a8c 474
Osamu Nakamura 0:ad834d403a8c 475 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 476 /* Drow string */
Osamu Nakamura 0:ad834d403a8c 477 ascii_font.Erase(0x00000090); /* rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red */
Osamu Nakamura 0:ad834d403a8c 478 int rest_size = strlen(*decode_str);
Osamu Nakamura 0:ad834d403a8c 479 int draw_idx = 0;
Osamu Nakamura 0:ad834d403a8c 480 int draw_size;
Osamu Nakamura 0:ad834d403a8c 481 int draw_line = 0;
Osamu Nakamura 0:ad834d403a8c 482
Osamu Nakamura 0:ad834d403a8c 483 while (rest_size > 0) {
Osamu Nakamura 0:ad834d403a8c 484 draw_size = ascii_font.DrawStr(*decode_str + draw_idx, 6, 5 + (18 * draw_line), 0x0000ffff, 2);
Osamu Nakamura 0:ad834d403a8c 485 if (draw_size <= 0) {
Osamu Nakamura 0:ad834d403a8c 486 break;
Osamu Nakamura 0:ad834d403a8c 487 }
Osamu Nakamura 0:ad834d403a8c 488 rest_size -= draw_size;
Osamu Nakamura 0:ad834d403a8c 489 draw_idx += draw_size;
Osamu Nakamura 0:ad834d403a8c 490 draw_line++;
Osamu Nakamura 0:ad834d403a8c 491 }
Osamu Nakamura 0:ad834d403a8c 492
Osamu Nakamura 0:ad834d403a8c 493 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
Osamu Nakamura 0:ad834d403a8c 494 string_draw = true;
Osamu Nakamura 0:ad834d403a8c 495 #endif
Osamu Nakamura 0:ad834d403a8c 496 decode_wait_time = 500;
Osamu Nakamura 0:ad834d403a8c 497 } else {
Osamu Nakamura 0:ad834d403a8c 498 #if LCD_ONOFF
Osamu Nakamura 0:ad834d403a8c 499 if (string_draw != false) {
Osamu Nakamura 0:ad834d403a8c 500 /* Clear string */
Osamu Nakamura 0:ad834d403a8c 501 ascii_font.Erase(0x00000000); /* rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red */
Osamu Nakamura 0:ad834d403a8c 502 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
Osamu Nakamura 0:ad834d403a8c 503 string_draw = false;
Osamu Nakamura 0:ad834d403a8c 504 }
Osamu Nakamura 0:ad834d403a8c 505 #endif
Osamu Nakamura 0:ad834d403a8c 506 decode_wait_time = 10;
Osamu Nakamura 0:ad834d403a8c 507 }
Osamu Nakamura 0:ad834d403a8c 508 }
Osamu Nakamura 0:ad834d403a8c 509 display_app.SendRgb888(decode_buffer, VIDEO_PIXEL_HW, VIDEO_PIXEL_VW);
Osamu Nakamura 0:ad834d403a8c 510 #endif
Osamu Nakamura 0:ad834d403a8c 511 }
Osamu Nakamura 0:ad834d403a8c 512 #endif // __ZXING_RESOURCE_H__