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
- GR-PEACH ( https://developer.mbed.org/platforms/Renesas-GR-PEACH/ )
- Audio Camera Shield ( https://developer.mbed.org/teams/Renesas/wiki/Audio_Camera-shield )
- LCD Shield ( https://developer.mbed.org/teams/Renesas/wiki/LCD-shield )
- BP3595 ( https://developer.mbed.org/components/BP3595-for-GR-PEACH/ )
- Ethernet cable and connection to the internet
Application setup
- 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. - 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. - 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. - 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
- Import this sample program onto mbed Compiler.
- Configure this sample program in accordance with Application setup.
- Compile the example on mbed Compiler and download the resultant binary file.
- Plug the Ethernet cable into GR-PEACH if you are using Ethernet mode.
- Plug the micro-USB cable into the OpenSDA port with lies on the next to the RESET button.
- 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.
- Press the RESET button on the board to run this sample program.
- 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:
- /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.
- /888/0/7700: Decode result of barcode data input from camera (GET)
Setup of Watson IoT
- 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:
- Select Internet of Things" as follows:
- Press Get Started as follows:
- Configure Watson IoT Instance
- Leave unbound
- Select the Free plan, then click Create
- You should create Watson IoT Application Credentials
Once you successfully create Watson IoT Instance, you should see the following Watson IoT dashboard:
- On dashboard, launch the Connect your devices dashboard
- Click APPS
- Click Generate API Key
- Record the API Key and Authenticatoin Token. Then click Generate after adding a comment Note that these two values will be needed in the later step.
- 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
- Select Node-RED Starter
- Enter a unique App name and Click Create
- Application will Stage after a few minutes
- Application will report app is running when the staging has completed
- Watson NodeRED Application should be binded to Watson IoT instance
- You can now see the dashboard below:
- Click Connections. Then, press Connect Existing
- Click on Watson IoT Instance badge. Then, press Connect
- NodeRED application will restage. This will take a while. Please wait for Your app is running state
- You should acquire mbed Device Connector DOMAIN value
- Go to the mbed Device Connector Dashboard: https://connector.mbed.com and log in
- Select Access Key in order to create a new token
- Click CREATE NEW ACCESS KEY and enter a unique name. Then, push ADD bution
- an API token is generated. Need to save the generated string for later steps
- You should configure Watson IoT ARM mbed Connector Bridge
- Go back to the Watson IoT Dashboard and select Extensions
- Press Add Extension
- Add ARM mbed Connector
- Setup the bridge
- Enter your Connector API Token to Access Key and MBED_DOMAIN to Domain Id, respectively. Then, click Check Connection
- If the connection is successfully established, you can see Connection Established. Then, press Done
- 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
- Select menu, Import and Clipboard
- Paste the entire contents of JSON code described in NODEFLOW_GR-PEACH.txt and click Import
- Watson IoT Application Node Flow should be configured
- Double-click input node and link them to your Watson IoT instance.
- Click on the edit button
- First enter arbitrary name. Then, Watson API Key and Watson Auth Token previously acquired. Finally, press Add to save
- Enter MBED_ENDPOINT_NAME in security.h as Device ID. Then, press Done to save
- Double-click output node
- 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:
- Click Deproy to deploy NodeRED application
- Invoke sample program
- Press the reset button on GR-PEACH
- The decode result of barcode data should be shown in debug window
- Also, you can toggle LED by clicking Turn LED OFF and Turn LED ON injection node
mbed-endpoint-resources/ZXingResource.h@0:ad834d403a8c, 2016-11-24 (annotated)
- Committer:
- Osamu Nakamura
- Date:
- Thu Nov 24 13:59:16 2016 +0900
- Revision:
- 0:ad834d403a8c
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New 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__ |