Web Camera for mbed-os. This sample works on GR-LYCHEE besides GR-PEACH. When you use this program, we judge you have agreed to the following contents. https://developer.mbed.org/teams/Renesas/wiki/About-LICENSE

Dependencies:   HttpServer_snapshot_mbed-os

License

When you use this program, we judge you have agreed to the following contents.
本プログラムを使用する際は、以下の内容に合意した事になります。

https://developer.mbed.org/teams/Renesas/wiki/About-LICENSE

Information

Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.

Video Links on how to setup and run WebCamera Application:

Your video will be live at:

Overview

This is a sample program that works on GR-PEACH or GR-LYCHEE.
This is a web camera sample program. When accessing from the Web browser, the following will be displayed.

  • Camera input picture
  • Control screen of devices connected to the I2C bus
  • LED control screen

Requirements

For GR-PEACH (via Wi-Fi):

  • GR-PEACH
  • GR-PEACH Wireless CAMERA Shield : OV7725

For GR-PEACH (via Ether):

  • GR-PEACH
  • One of the following
    • GR-PEACH Wireless CAMERA Shield : OV7725
    • NTSC analog camera
    • MT9V111 and GR-PEACH AUDIO CAMERA Shield
    • OV5642 and GR-PEACH AUDIO CAMERA Shield

For GR-LYCHEE (via Wi-Fi):

  • GR-LYCHEE

How to use

Turn on the power to the GR-Board and start the terminal software.
The default value of the bow rate with mbed is 9600, and in this sample we use the baud rate 9600.

When you press the reset button of GR-Board, the scan result of Wifi will be output on Terminal. Please refer to the following link for usage of Terminal.

********* PROGRAM START ***********
Network Setting up...
Scan:
No.0 Network: SSID_1 secured:WPA/WPA2 BSSID: xx:xx:xx:xx:xx:xx RSSI: -52 Ch: 1
No.1 Network: SSID_2 secured: Unknown BSSID: xx:xx:xx:xx:xx:xx RSSI: -67 Ch: 2
2 networks available.

Please enter the number of the network you want to connect.
Enter key:[0]-[1], (If inputting the other key, it's scanned again.)

Enter the number of the network you want to connect from the keyboard. To select SSID_1, press "0" on the keyboard.

[SSID_1] is selected.
please enter the PSK.

Finally, enter the password to connect to the network.

If the connection is successful, the IP address is output on Terminal.

connecting...
MAC Address is xx:xx:xx:xx:xx:xx
IP Address is 192.168.0.2
NetMask is 255.255.255.240
Gateway Address is 192.168.0.1
Network Setup OK

When you open IP Address ("192.168.0.2" in the above example) by a Web browser, top screen is indicated. The configuration of the top screen is a menu screen on the left side, a description screen of the sample program on the right side. If you click on each menu on the left side of the screen, the screen along the menu is indicated on the right screen.

Page Top

/media/uploads/1050186/web_top2.jpg

Web Camera

/media/uploads/1050186/camera3.jpg
When you click the "Web camera" in the menu screen, the pictures of a camera is indicated. It can be changed at a slider bar in "Wait time" at the timing of a renewal of a camera picture. (Defaults are 500ms.)

Setting by I2C

/media/uploads/1050186/setting_i2c3.jpg
When you click the "Setting by I2C" of the menu screen, the control screen of the device connected to the I2C bus is indicated. By sending a command of a format listed below("Format of the device set by I2C") in Direct input or File reference, data transmission and reception is possible with respect to devices connected to I2C_SDA and I2C_SCL terminals of I2C. The communication log of transmission and reception by "Format of the device set by I2C" is displayed in the log window. When you press the "Clear" button, the log is cleared. When you press the "Save" button, the log is saved.

Format of the device set by I2C

Method:I2C addr,data length,data1,data2,data3,...

The details of each parameter is shown below.
For specific settings, check on the specifications of the connected device, you must create a command along the format.

MethodPlease specify one of the following:
"Wr" ・・・ Write functions in I2C
"Rd" ・・・ Read functions in I2C
"WrNoP" ・・・ Write functions in I2C(No STOP condition)
"RdNoP" ・・・ Read functions in I2C(No STOP condition)
I2C addrSet the I2C address of device in hexadecimal.
Ex: If the address is 0x90, set the "90"
data lengthIf Method is "Wr" or "WrNoP", set write size(the size of the data portion) in hexadecimal.
Ex: If the write size is 2 byte(data1, data2), set the "02".
If Method is "Rd" or "RdNoP", set read size in hexadecimal.
Ex: If the read size is 10 byte, set the "0A".
dataIf Method is "Wr" or "WrNoP", set write data in 1 byte unit in hexadecimal.
Ex: If the write data is 0x01 0x02, set "01" in the data1 and "02" in the data2.
If Method is "Rd" or "RdNoP", this parameter is omitted.

An example of the format is shown below.

Wr:90,03,25,45,14

To the device of the I2C address 0x90, the data write of 3Byte(0x25 0x45 0x14)

Rd:90,02

To the device of the I2C address 0x90, the data read of 2Byte

LED On/Off

/media/uploads/1050186/led2.jpg
When you click the "LED On/Off" of the menu screen, the LED control screen is indicated. Each switch switches of GR-Boards to ON or OFF. Each switch indicates the current LED state. When the LED is On, the color of switch will change the LED color.

Switch to web page in SD card

Web pages displayed on the Web browser are located in the built-in ROM. file_table_peach.h is saved as table information for GR-PEACH and file_table_lychee.h is saved as table information for GR-LYCHEE. The contents of the saved file are as follows.

When connecting the SD card, SDBlockDevice will be displayed on the terminal and the web page displayed in the web browser will switch from the built-in ROM to the SD card. The top page is index.htm.

Change network connection

You can change the network connection by changing the following macro in main.cpp.

/**** User Selection *********/
#define NETWORK_TYPE           (2)                 /* Select  0(Ethernet), 1(BP3595), 2(ESP32 STA) ,3(ESP32 AP) */
#if (NETWORK_TYPE >= 1)
  #define SCAN_NETWORK         (1)                 /* Select  0(Use WLAN_SSID, WLAN_PSK, WLAN_SECURITY) or 1(To select a network using the terminal.) */
  #define WLAN_SSID            ("SSIDofYourAP")    /* SSID */
  #define WLAN_PSK             ("PSKofYourAP")     /* PSK(Pre-Shared Key) */
  #define WLAN_SECURITY        NSAPI_SECURITY_WPA_WPA2 /* NSAPI_SECURITY_NONE, NSAPI_SECURITY_WEP, NSAPI_SECURITY_WPA, NSAPI_SECURITY_WPA2 or NSAPI_SECURITY_WPA_WPA2 */
#endif

Depending on the value set for NETWORK_TYPE, the connection method changes as follows.

NumberConnectionDescription
0EthernetGR-PEACH only
1reservedIt can not be selected.
2ESP32 STAUse ESP32 in STA mode.
3ESP32 APUse ESP32 in AP mode.

When using GR-LYCHEE, NETWORK_TYPE 2 and 3 can be selected.
GR-PEACH Wireless CAMERA Shield is required separately when using ESP32 with GR-PEACH.

When using Ethernet, the user must provide the MAC address.
To specify MAC address, add fllowing function to main.cpp.

Specify MAC address

// set mac address
void mbed_mac_address(char *mac) {
    mac[0] = 0x00;
    mac[1] = 0x02;
    mac[2] = 0xF7;
    mac[3] = 0xF0;
    mac[4] = 0x00;
    mac[5] = 0x00;
}

Camera selection

To select the Camera, add camera-type to mbed_app.json.
See here for details.

mbed_app.json

{
    "config": {
        "camera":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "camera-type":{
            "help": "Please see EasyAttach_CameraAndLCD/README.md",
            "value": null
        },
        "lcd":{
            "help": "0:disable 1:enable",
            "value": "0"
        },
        "lcd-type":{
            "help": "Please see EasyAttach_CameraAndLCD/README.md",
            "value": null
        }
    },
    "target_overrides": {
        "RZ_A1H": {
            "camera-type" : "CAMERA_WIRELESS_CAMERA"
        }
    }
}

Appendix


概要

GR-PEACH、および、GR-LYCHEEで動作するサンプルプログラムです。
Webカメラのサンプルです。Webブラウザからアクセスすると以下が表示されます。

  • Camera入力画像
  • I2Cバスに繋がっているデバイスの制御画面
  • LED操作画面

構成

GR-PEACH (Wi-Fi経由)の場合:

  • GR-PEACH
  • GR-PEACH Wireless CAMERA Shield : OV7725

GR-PEACH (Ether経由)の場合:

  • GR-PEACH
  • 以下のいずれか
    • GR-PEACH Wireless CAMERA Shield : OV7725
    • NTSCアナログカメラ
    • MT9V111 and GR-PEACH AUDIO CAMERA Shield
    • OV5642 and GR-PEACH AUDIO CAMERA Shield

GR-LYCHEE(Wi-Fi経由)の場合:

  • GR-LYCHEE

使い方

GR-Boardに電源を入れ、Terminalソフトを立ち上げます。
Mbedでのボーレートのデフォルト値は9600で、このサンプルではボーレート9600を使います。

GR-Boardのリセットボタンを押すと、Terminal上にWifiのスキャン結果が出力されます。

********* PROGRAM START ***********
Network Setting up...
Scan:
No.0 Network: SSID_1 secured:WPA/WPA2 BSSID: xx:xx:xx:xx:xx:xx RSSI: -52 Ch: 1
No.1 Network: SSID_2 secured: Unknown BSSID: xx:xx:xx:xx:xx:xx RSSI: -67 Ch: 2
2 networks available.

Please enter the number of the network you want to connect.
Enter key:[0]-[1], (If inputting the other key, it's scanned again.)

接続したいネットワークの番号をキーボードから入力します。0番のSSID_1を選択する場合はキーボードの "0" を押します。

[SSID_1] is selected.
please enter the PSK.

最後にネットワークに接続するためのパスワードを入力します。

接続に成功すると、Terminal上にIPアドレスが出力されます。

connecting...
MAC Address is xx:xx:xx:xx:xx:xx
IP Address is 192.168.0.2
NetMask is 255.255.255.240
Gateway Address is 192.168.0.1
Network Setup OK

PCのWebブラウザで Terminalに表示された IP Address (上記例では 192.168.0.2)を開くと、トップ画面が表示されます。トップ画面は、左側にメニュー画面、右側にサンプルプログラムの説明画面という構成になっており、左画面の各メニューをクリックすると、メニューに沿った画面が右画面に表示されます。

Page Top 画面

/media/uploads/1050186/web_top2.jpg

Web Camera 画面

/media/uploads/1050186/camera3.jpg
メニュー画面の”Web Camera”をクリックすると、Camera画像が表示されます。
"Wait time"のスライダーバーでCamera画像の更新タイミングが変更できます。(初期値は500msです)

Setting by I2C 画面

/media/uploads/1050186/setting_i2c3.jpg

メニュー画面の"Setting by I2C"をクリックすると、I2Cバスに繋がっているデバイスの制御画面が表示されます。直接入力(Direct input)欄又はファイル参照(File reference)欄にて、下記("I2Cによるデバイス設定のフォーマット")に記載されているフォーマットのコマンドを送信する事で、I2CのI2C_SDA,I2C_SCL端子に繋がっているデバイスに対して、データの送受信が可能です。"I2Cによるデバイス設定のフォーマット"による送受信の通信ログは、ログウィンドウに表示されます。"Clear"ボタンを押すとログのクリア、"Save"ボタンを押すとログの保存ができます。

I2Cによるデバイス設定のフォーマット

Method:I2C addr,data length,data1,data2,data3,...

各パラメータの詳細を以下に示します。
具体的な設定値については、接続先のデバイスの仕様をご確認のうえ、フォーマットに沿ってコマンドを作成して下さい。

Method以下のいづれかを指定して下さい
"Wr" ・・・ I2Cでの書き込み
"Rd" ・・・ I2Cでの読み出し
"WrNoP" ・・・ I2Cでの書き込み(STOPコンディション省略)
"RdNoP" ・・・ I2Cでの読み出し(STOPコンディション省略)
I2C addr接続先デバイスのI2Cアドレスを16進数で設定して下さい。
(例) アドレスが0x90の場合、"90"を設定
data lengthMethodが"Wr"又は"WrNoP"の場合、書き込むサイズ(data部分のサイズ)を16進数で設定して下さい。
(例) 書き込むサイズが2Byte(data1,data2)の場合、"02"を設定
Methodが"Rd"又は"RdNoP"の場合は読み取るサイズを16進数で設定して下さい。
(例) 読み取りサイズが10Byteの場合、"0A"を設定
dataMethodが"Wr"又は"WrNoP"の場合、書き込むデータを16進数で1Byte単位で設定して下さい。
(例) 書き込みデータが0x01,0x02の場合、data1に"01"、data2に"02"を設定
"Rd"又は"RdNoP"の場合は省略して下さい。

フォーマットの例を以下に示します。

Wr:90,03,25,45,14

I2Cアドレス0x90のデバイスに対して0x25 0x45 0x14の計3Byteのデータ書き込み

Rd:90,02

I2Cアドレス0x90のデバイスに対して2Byteのデータ読み出し

LED On/Off 画面

/media/uploads/1050186/led2.jpg
メニュー画面の"LED On/Off"をクリックすると、LED操作画面が表示されます。各スイッチはGR-BoardのLED ON/OFFを切り替えます。スイッチはそれぞれGR-BoardのLEDの現在の状態を表しており、ONにすると対応するLEDの色になります。

SDカード内のWebページに切り替える

Webブラウザで表示されるWebページは内蔵ROMに配置されています。file_table_peach.h はGR-PEACH用、 file_table_lychee.h はGR-LYCHEE用のWebページがテーブル情報として保存されています。保存されているファイルの内容は下記の通りです。

SDカードを接続するとTerminal上に SDBlockDevice と表示され、Webブラウザで表示されるWebページが内蔵ROMからSDカードに切り替わります。トップページは index.htm となります。

ネットワークの接続方法を変更する

main.cppの下記マクロを変更することでネットワークの接続方法を変更できます。

/**** User Selection *********/
#define NETWORK_TYPE           (2)                 /* Select  0(Ethernet), 1(BP3595), 2(ESP32 STA) ,3(ESP32 AP) */
#if (NETWORK_TYPE >= 1)
  #define SCAN_NETWORK         (1)                 /* Select  0(Use WLAN_SSID, WLAN_PSK, WLAN_SECURITY) or 1(To select a network using the terminal.) */
  #define WLAN_SSID            ("SSIDofYourAP")    /* SSID */
  #define WLAN_PSK             ("PSKofYourAP")     /* PSK(Pre-Shared Key) */
  #define WLAN_SECURITY        NSAPI_SECURITY_WPA_WPA2 /* NSAPI_SECURITY_NONE, NSAPI_SECURITY_WEP, NSAPI_SECURITY_WPA, NSAPI_SECURITY_WPA2 or NSAPI_SECURITY_WPA_WPA2 */
#endif

NETWORK_TYPE に設定する値により、以下の接続方法に切り替わります。

番号接続方法説明
0EthernetGR-PEACHのみ。
1reserved選択できません。
2ESP32 STAESP32をSTAモードで使用します。
3ESP32 APESP32をAPモードで使用します。

GR-LYCHEEを使用する場合はNETWORK_TYPE 2と3が選択できます。
GR-PEACHでNETWORK_TYPE 2と3を使用する場合は別途GR-PEACH Wireless/Cameraシールドが必要です。

NETWORK_TYPE 1のEthernetを使う場合はMACアドレスをユーザが用意する必要があります。
"main.cpp"の最後にの下記のように関数を追加し、用意したMACアドレスを設定してください。

Specify MAC address

// set mac address
void mbed_mac_address(char *mac) {
    mac[0] = 0x00;
    mac[1] = 0x02;
    mac[2] = 0xF7;
    mac[3] = 0xF0;
    mac[4] = 0x00;
    mac[5] = 0x00;
}

カメラの設定

カメラの指定を行う場合はmbed_app.jsonにcamera-typeを変更して追加してください。
詳細はこちらを参照ください。

mbed_app.json

{
    "config": {
        "camera":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "camera-type":{
            "help": "Please see EasyAttach_CameraAndLCD/README.md",
            "value": null
        },
        "lcd":{
            "help": "0:disable 1:enable",
            "value": "0"
        },
        "lcd-type":{
            "help": "Please see EasyAttach_CameraAndLCD/README.md",
            "value": null
        }
    },
    "target_overrides": {
        "RZ_A1H": {
            "camera-type" : "CAMERA_WIRELESS_CAMERA"
        }
    }
}

付録

Committer:
1050186
Date:
Fri Oct 23 11:03:49 2015 +0000
Revision:
5:34d84609dd60
Child:
7:c45ecff1b44d
Update functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
1050186 5:34d84609dd60 1 /*
1050186 5:34d84609dd60 2 Permission is hereby granted, free of charge, to any person obtaining a copy
1050186 5:34d84609dd60 3 of this software and associated documentation files (the "Software"), to deal
1050186 5:34d84609dd60 4 in the Software without restriction, including without limitation the rights
1050186 5:34d84609dd60 5 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1050186 5:34d84609dd60 6 copies of the Software, and to permit persons to whom the Software is
1050186 5:34d84609dd60 7 furnished to do so, subject to the following conditions:
1050186 5:34d84609dd60 8
1050186 5:34d84609dd60 9 The above copyright notice and this permission notice shall be included in
1050186 5:34d84609dd60 10 all copies or substantial portions of the Software.
1050186 5:34d84609dd60 11
1050186 5:34d84609dd60 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1050186 5:34d84609dd60 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1050186 5:34d84609dd60 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1050186 5:34d84609dd60 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1050186 5:34d84609dd60 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1050186 5:34d84609dd60 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1050186 5:34d84609dd60 18 THE SOFTWARE.
1050186 5:34d84609dd60 19 */
1050186 5:34d84609dd60 20
1050186 5:34d84609dd60 21 #include "mbed.h"
1050186 5:34d84609dd60 22 #include "i2c_setting.h"
1050186 5:34d84609dd60 23
1050186 5:34d84609dd60 24 I2C i2c(I2C_SDA, I2C_SCL);
1050186 5:34d84609dd60 25 Serial terminal(USBTX, USBRX);
1050186 5:34d84609dd60 26
1050186 5:34d84609dd60 27 static char recv_term_buffer[RECV_BUF_SIZE];
1050186 5:34d84609dd60 28 static char reg_req_buffer[REG_REQ_BUF_SIZE];
1050186 5:34d84609dd60 29 static char reg_arg_buf[ARG_MAX_NUM];
1050186 5:34d84609dd60 30 static char wr_data[DATA_MAX_SIZE];
1050186 5:34d84609dd60 31 static char rd_data[DATA_MAX_SIZE];
1050186 5:34d84609dd60 32 static char recv_data;
1050186 5:34d84609dd60 33 static int32_t term_buf_offset = 0;
1050186 5:34d84609dd60 34
1050186 5:34d84609dd60 35 static char hex_to_char_tbl[] = {
1050186 5:34d84609dd60 36 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
1050186 5:34d84609dd60 37 'A', 'B', 'C', 'D', 'E', 'F'
1050186 5:34d84609dd60 38 };
1050186 5:34d84609dd60 39
1050186 5:34d84609dd60 40 static int str_to_hex(char * psrcbuf, char * pdestbuf, int cnt) {
1050186 5:34d84609dd60 41 int retval = false;
1050186 5:34d84609dd60 42 int32_t tmp_hex;
1050186 5:34d84609dd60 43
1050186 5:34d84609dd60 44 if ((psrcbuf != NULL) && (pdestbuf != NULL)) {
1050186 5:34d84609dd60 45 retval = true;
1050186 5:34d84609dd60 46 if ((((int32_t)*psrcbuf) >= '0') && (((int32_t)*psrcbuf) <= '9')) {
1050186 5:34d84609dd60 47 tmp_hex = NUM_STR_TO_HEX;
1050186 5:34d84609dd60 48 } else if ((((int32_t)*psrcbuf) >= 'A') && (((int32_t)*psrcbuf) <= 'F')) {
1050186 5:34d84609dd60 49 tmp_hex = BIG_STR_TO_HEX;
1050186 5:34d84609dd60 50 } else if ((((int32_t)*psrcbuf) >= 'a') && (((int32_t)*psrcbuf) <= 'f')) {
1050186 5:34d84609dd60 51 tmp_hex = SMA_STR_TO_HEX;
1050186 5:34d84609dd60 52 } else {
1050186 5:34d84609dd60 53 retval = false;
1050186 5:34d84609dd60 54 }
1050186 5:34d84609dd60 55 if (retval == true) {
1050186 5:34d84609dd60 56 *pdestbuf += ((int32_t)*psrcbuf) - tmp_hex;
1050186 5:34d84609dd60 57 if (cnt == 0) {
1050186 5:34d84609dd60 58 *pdestbuf *= MASK_HEX10;
1050186 5:34d84609dd60 59 }
1050186 5:34d84609dd60 60 }
1050186 5:34d84609dd60 61 }
1050186 5:34d84609dd60 62
1050186 5:34d84609dd60 63 return retval;
1050186 5:34d84609dd60 64 }
1050186 5:34d84609dd60 65
1050186 5:34d84609dd60 66 static void char_to_16char(char * pdestbuf, char * psrcbuf, int length) {
1050186 5:34d84609dd60 67 if ((pdestbuf != NULL) && (psrcbuf != NULL)) {
1050186 5:34d84609dd60 68 while(length != 0) {
1050186 5:34d84609dd60 69 *pdestbuf = hex_to_char_tbl[((int32_t)*psrcbuf) / MASK_HEX10];
1050186 5:34d84609dd60 70 pdestbuf++;
1050186 5:34d84609dd60 71 *pdestbuf = hex_to_char_tbl[((int32_t)*psrcbuf) % MASK_HEX10];
1050186 5:34d84609dd60 72 pdestbuf++;
1050186 5:34d84609dd60 73
1050186 5:34d84609dd60 74 psrcbuf++;
1050186 5:34d84609dd60 75 length--;
1050186 5:34d84609dd60 76 }
1050186 5:34d84609dd60 77 *pdestbuf = CODE_NULL;
1050186 5:34d84609dd60 78 }
1050186 5:34d84609dd60 79 }
1050186 5:34d84609dd60 80 static int receive_term(void) {
1050186 5:34d84609dd60 81 int ret = false;
1050186 5:34d84609dd60 82
1050186 5:34d84609dd60 83 recv_data = terminal.getc();
1050186 5:34d84609dd60 84 /* echo back */
1050186 5:34d84609dd60 85 printf("%c", recv_data);
1050186 5:34d84609dd60 86 switch ((int32_t)recv_data) {
1050186 5:34d84609dd60 87 case 0x0A :
1050186 5:34d84609dd60 88 recv_term_buffer[term_buf_offset] = CODE_NULL;
1050186 5:34d84609dd60 89 term_buf_offset = 0;
1050186 5:34d84609dd60 90 ret = true;
1050186 5:34d84609dd60 91 break;
1050186 5:34d84609dd60 92 case 0x0D :
1050186 5:34d84609dd60 93 /* Do Nothing */
1050186 5:34d84609dd60 94 break;
1050186 5:34d84609dd60 95 default :
1050186 5:34d84609dd60 96 /* check data_buffer size */
1050186 5:34d84609dd60 97 if (term_buf_offset < RECV_BUF_SIZE) {
1050186 5:34d84609dd60 98 recv_term_buffer[term_buf_offset] = recv_data;
1050186 5:34d84609dd60 99 term_buf_offset++;
1050186 5:34d84609dd60 100 }
1050186 5:34d84609dd60 101 break;
1050186 5:34d84609dd60 102 }
1050186 5:34d84609dd60 103
1050186 5:34d84609dd60 104 return ret;
1050186 5:34d84609dd60 105
1050186 5:34d84609dd60 106 }
1050186 5:34d84609dd60 107
1050186 5:34d84609dd60 108 static int analysis_cmd(char * buf) {
1050186 5:34d84609dd60 109 int arg_cnt;
1050186 5:34d84609dd60 110 int byte_cnt;
1050186 5:34d84609dd60 111 int retval;
1050186 5:34d84609dd60 112 char * psrcbuf;
1050186 5:34d84609dd60 113 char * pdestbuf;
1050186 5:34d84609dd60 114
1050186 5:34d84609dd60 115 arg_cnt = 0;
1050186 5:34d84609dd60 116 byte_cnt = 0;
1050186 5:34d84609dd60 117 /* get reg req */
1050186 5:34d84609dd60 118 memset(&reg_req_buffer[0], 0, REG_REQ_BUF_SIZE);
1050186 5:34d84609dd60 119 psrcbuf = buf;
1050186 5:34d84609dd60 120 pdestbuf = &reg_req_buffer[0];
1050186 5:34d84609dd60 121 while (((int32_t)*psrcbuf) != ':') {
1050186 5:34d84609dd60 122 if (byte_cnt >= REG_REQ_BUF_SIZE) {
1050186 5:34d84609dd60 123 arg_cnt = DATA_ANALY_ERROR;
1050186 5:34d84609dd60 124 goto err_out;
1050186 5:34d84609dd60 125 } else {
1050186 5:34d84609dd60 126 *pdestbuf = *psrcbuf;
1050186 5:34d84609dd60 127 byte_cnt++;
1050186 5:34d84609dd60 128 pdestbuf++;
1050186 5:34d84609dd60 129 psrcbuf++;
1050186 5:34d84609dd60 130 }
1050186 5:34d84609dd60 131 }
1050186 5:34d84609dd60 132 *pdestbuf = *psrcbuf;
1050186 5:34d84609dd60 133 if ((strncmp(&reg_req_buffer[0], "Wr:", REG_REQ_BUF_SIZE) == 0) || (strncmp(&reg_req_buffer[0], "Rd:", REG_REQ_BUF_SIZE) == 0) ||
1050186 5:34d84609dd60 134 (strncmp(&reg_req_buffer[0], "WrNoP:", REG_REQ_BUF_SIZE) == 0) || (strncmp(&reg_req_buffer[0], "RdNoP:", REG_REQ_BUF_SIZE) == 0)) {
1050186 5:34d84609dd60 135 /* get argument(I2C addr, len, data1, data2, data3, ...) */
1050186 5:34d84609dd60 136 byte_cnt = 0;
1050186 5:34d84609dd60 137 memset(&reg_arg_buf[0], 0, sizeof(reg_arg_buf));
1050186 5:34d84609dd60 138 psrcbuf++;
1050186 5:34d84609dd60 139 while (((int32_t)*psrcbuf) != CODE_NULL) {
1050186 5:34d84609dd60 140 retval = str_to_hex(psrcbuf, &reg_arg_buf[arg_cnt], byte_cnt);
1050186 5:34d84609dd60 141 if (retval == true) {
1050186 5:34d84609dd60 142 byte_cnt++;
1050186 5:34d84609dd60 143 psrcbuf++;
1050186 5:34d84609dd60 144 if (byte_cnt >= ARG_MAX_SIZE) {
1050186 5:34d84609dd60 145 if ((arg_cnt + 1) >= ARG_MAX_NUM) {
1050186 5:34d84609dd60 146 arg_cnt = DATA_ANALY_ERROR;
1050186 5:34d84609dd60 147 goto err_out;
1050186 5:34d84609dd60 148 } else {
1050186 5:34d84609dd60 149 arg_cnt++;
1050186 5:34d84609dd60 150 byte_cnt = 0;
1050186 5:34d84609dd60 151 }
1050186 5:34d84609dd60 152 }
1050186 5:34d84609dd60 153 } else {
1050186 5:34d84609dd60 154 psrcbuf++;
1050186 5:34d84609dd60 155 }
1050186 5:34d84609dd60 156 }
1050186 5:34d84609dd60 157 } else {
1050186 5:34d84609dd60 158 arg_cnt = DATA_ANALY_ERROR;
1050186 5:34d84609dd60 159 goto err_out;
1050186 5:34d84609dd60 160 }
1050186 5:34d84609dd60 161
1050186 5:34d84609dd60 162 err_out:
1050186 5:34d84609dd60 163
1050186 5:34d84609dd60 164 return arg_cnt;
1050186 5:34d84609dd60 165 }
1050186 5:34d84609dd60 166
1050186 5:34d84609dd60 167 static void execute_cmd(void) {
1050186 5:34d84609dd60 168 char convert_data[(DATA_MAX_SIZE * 2) + NULL_SIZE];
1050186 5:34d84609dd60 169
1050186 5:34d84609dd60 170 /* check length */
1050186 5:34d84609dd60 171 if (reg_arg_buf[1] >= DATA_MAX_SIZE) {
1050186 5:34d84609dd60 172 reg_arg_buf[1] = DATA_MAX_SIZE;
1050186 5:34d84609dd60 173 }
1050186 5:34d84609dd60 174 /* check request */
1050186 5:34d84609dd60 175 if (strncmp(&reg_req_buffer[0], "Wr:", REG_REQ_BUF_SIZE) == 0) {
1050186 5:34d84609dd60 176 /* write */
1050186 5:34d84609dd60 177 memcpy(&wr_data[0], &reg_arg_buf[2], reg_arg_buf[1]);
1050186 5:34d84609dd60 178 (void)i2c.write(reg_arg_buf[0], wr_data, reg_arg_buf[1], 0); // write(I2C Addr, write data, len, restart flg(=0))
1050186 5:34d84609dd60 179 } else if (strncmp(&reg_req_buffer[0], "Rd:", REG_REQ_BUF_SIZE) == 0) {
1050186 5:34d84609dd60 180 /* read */
1050186 5:34d84609dd60 181 memset(&rd_data[0], 0, reg_arg_buf[1]);
1050186 5:34d84609dd60 182 (void)i2c.read(reg_arg_buf[0], rd_data, reg_arg_buf[1], 0); // read(I2C Addr, read data, len, restart flg(=0))
1050186 5:34d84609dd60 183
1050186 5:34d84609dd60 184 char_to_16char(&convert_data[0], &rd_data[0], reg_arg_buf[1]);
1050186 5:34d84609dd60 185 DEBUGPRINT(" Read Data is %s\r\n", &convert_data[0]);
1050186 5:34d84609dd60 186 } else if (strncmp(&reg_req_buffer[0], "WrNoP:", REG_REQ_BUF_SIZE) == 0) {
1050186 5:34d84609dd60 187 /* write(non stop condition) */
1050186 5:34d84609dd60 188 memcpy(&wr_data[0], &reg_arg_buf[2], reg_arg_buf[1]);
1050186 5:34d84609dd60 189 (void)i2c.write(reg_arg_buf[0], wr_data, reg_arg_buf[1], 1); // write(I2C Addr, write data, len, restart flg(=1))
1050186 5:34d84609dd60 190 } else if (strncmp(&reg_req_buffer[0], "RdNoP:", REG_REQ_BUF_SIZE) == 0) {
1050186 5:34d84609dd60 191 /* read(non stop condition) */
1050186 5:34d84609dd60 192 memset(&rd_data[0], 0, reg_arg_buf[1]);
1050186 5:34d84609dd60 193 (void)i2c.read(reg_arg_buf[0], rd_data, reg_arg_buf[1], 1); // read(I2C Addr, read data, len, restart flg(=1))
1050186 5:34d84609dd60 194
1050186 5:34d84609dd60 195 char_to_16char(&convert_data[0], &rd_data[0], reg_arg_buf[1]);
1050186 5:34d84609dd60 196 DEBUGPRINT(" Read Data is %s\r\n", &convert_data[0]);
1050186 5:34d84609dd60 197 }
1050186 5:34d84609dd60 198 }
1050186 5:34d84609dd60 199
1050186 5:34d84609dd60 200 void analy_and_exe(char * buf) {
1050186 5:34d84609dd60 201 int reg_arg_cnt;
1050186 5:34d84609dd60 202
1050186 5:34d84609dd60 203 /* analysis command */
1050186 5:34d84609dd60 204 reg_arg_cnt = analysis_cmd(buf);
1050186 5:34d84609dd60 205 if (reg_arg_cnt != DATA_ANALY_ERROR) {
1050186 5:34d84609dd60 206 /* execute command */
1050186 5:34d84609dd60 207 execute_cmd();
1050186 5:34d84609dd60 208 }
1050186 5:34d84609dd60 209 }
1050186 5:34d84609dd60 210
1050186 5:34d84609dd60 211 void SetI2CfromTerm(void const *argument) {
1050186 5:34d84609dd60 212 int ret;
1050186 5:34d84609dd60 213
1050186 5:34d84609dd60 214 while (1) {
1050186 5:34d84609dd60 215 ret = receive_term();
1050186 5:34d84609dd60 216 if (ret == true) {
1050186 5:34d84609dd60 217 /* command analysis and execute */
1050186 5:34d84609dd60 218 analy_and_exe(&recv_term_buffer[0]);
1050186 5:34d84609dd60 219 }
1050186 5:34d84609dd60 220 }
1050186 5:34d84609dd60 221 }
1050186 5:34d84609dd60 222