Web Camera for mbed-os. 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 LWIPBP3595Interface_STA_for_mbed-os RomRamBlockDevice mbed-rpc

Fork of GR-Boards_WebCamera by Renesas

このサンプルは 「GR-LYCHEE」ではじめる電子工作 で紹介しています。
出版時と内容が異ならないよう、各ライブラリはアップデートせずに使用してください。

このサンプルの最新バージョンは下記から入手できます。最新バージョンは本の内容と一部処理が異なります。
https://github.com/d-kato/GR-Boards_WebCamera

Committer:
dkato
Date:
Fri Feb 02 07:09:12 2018 +0000
Revision:
25:63b0be9c69dc
Parent:
7:c45ecff1b44d
Use mbed-os-lychee instead of mbed-os library

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
dkato 7:c45ecff1b44d 24 #define REG_REQ_BUF_SIZE (7)
dkato 7:c45ecff1b44d 25 #define DATA_MAX_SIZE (32)
dkato 7:c45ecff1b44d 26 #define ARG_MAX_NUM (DATA_MAX_SIZE + 3) // Reqest, I2C addr, len, data1, data2, data3, ...
dkato 7:c45ecff1b44d 27 #define ARG_MAX_SIZE (2) // upper bit + lower bit
dkato 7:c45ecff1b44d 28 #define NULL_SIZE (1)
dkato 7:c45ecff1b44d 29 #define CODE_NULL (0x00)
dkato 7:c45ecff1b44d 30 #define NUM_STR_TO_HEX (0x30)
dkato 7:c45ecff1b44d 31 #define BIG_STR_TO_HEX (0x37)
dkato 7:c45ecff1b44d 32 #define SMA_STR_TO_HEX (0x57)
dkato 7:c45ecff1b44d 33 #define MASK_HEX10 (0x10)
1050186 5:34d84609dd60 34
dkato 7:c45ecff1b44d 35 #define OFS_REQ (0)
dkato 7:c45ecff1b44d 36 #define OFS_I2C_ADDR (1)
dkato 7:c45ecff1b44d 37 #define OFS_DATA_SIZE (2)
dkato 7:c45ecff1b44d 38 #define OFS_DATA (3)
dkato 7:c45ecff1b44d 39
dkato 7:c45ecff1b44d 40 #define STR_WR "Wr:"
dkato 7:c45ecff1b44d 41 #define STR_RD "Rd:"
dkato 7:c45ecff1b44d 42 #define STR_WR_NO_P "WrNoP:"
dkato 7:c45ecff1b44d 43 #define STR_RD_NO_P "RdNoP:"
dkato 7:c45ecff1b44d 44
dkato 7:c45ecff1b44d 45 #define REQ_NONE (0)
dkato 7:c45ecff1b44d 46 #define REQ_WR (1)
dkato 7:c45ecff1b44d 47 #define REQ_RD (2)
dkato 7:c45ecff1b44d 48 #define REQ_WR_NO_P (3)
dkato 7:c45ecff1b44d 49 #define REQ_RD_NO_P (4)
dkato 7:c45ecff1b44d 50
dkato 7:c45ecff1b44d 51 I2C i2c(I2C_SDA, I2C_SCL);
1050186 5:34d84609dd60 52
1050186 5:34d84609dd60 53 static char hex_to_char_tbl[] = {
1050186 5:34d84609dd60 54 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
1050186 5:34d84609dd60 55 'A', 'B', 'C', 'D', 'E', 'F'
1050186 5:34d84609dd60 56 };
1050186 5:34d84609dd60 57
1050186 5:34d84609dd60 58 static int str_to_hex(char * psrcbuf, char * pdestbuf, int cnt) {
1050186 5:34d84609dd60 59 int retval = false;
1050186 5:34d84609dd60 60 int32_t tmp_hex;
1050186 5:34d84609dd60 61
1050186 5:34d84609dd60 62 if ((psrcbuf != NULL) && (pdestbuf != NULL)) {
1050186 5:34d84609dd60 63 retval = true;
1050186 5:34d84609dd60 64 if ((((int32_t)*psrcbuf) >= '0') && (((int32_t)*psrcbuf) <= '9')) {
1050186 5:34d84609dd60 65 tmp_hex = NUM_STR_TO_HEX;
1050186 5:34d84609dd60 66 } else if ((((int32_t)*psrcbuf) >= 'A') && (((int32_t)*psrcbuf) <= 'F')) {
1050186 5:34d84609dd60 67 tmp_hex = BIG_STR_TO_HEX;
1050186 5:34d84609dd60 68 } else if ((((int32_t)*psrcbuf) >= 'a') && (((int32_t)*psrcbuf) <= 'f')) {
1050186 5:34d84609dd60 69 tmp_hex = SMA_STR_TO_HEX;
1050186 5:34d84609dd60 70 } else {
1050186 5:34d84609dd60 71 retval = false;
1050186 5:34d84609dd60 72 }
1050186 5:34d84609dd60 73 if (retval == true) {
1050186 5:34d84609dd60 74 *pdestbuf += ((int32_t)*psrcbuf) - tmp_hex;
1050186 5:34d84609dd60 75 if (cnt == 0) {
1050186 5:34d84609dd60 76 *pdestbuf *= MASK_HEX10;
1050186 5:34d84609dd60 77 }
1050186 5:34d84609dd60 78 }
1050186 5:34d84609dd60 79 }
1050186 5:34d84609dd60 80
1050186 5:34d84609dd60 81 return retval;
1050186 5:34d84609dd60 82 }
1050186 5:34d84609dd60 83
1050186 5:34d84609dd60 84 static void char_to_16char(char * pdestbuf, char * psrcbuf, int length) {
1050186 5:34d84609dd60 85 if ((pdestbuf != NULL) && (psrcbuf != NULL)) {
dkato 7:c45ecff1b44d 86 while (1) {
1050186 5:34d84609dd60 87 *pdestbuf = hex_to_char_tbl[((int32_t)*psrcbuf) / MASK_HEX10];
1050186 5:34d84609dd60 88 pdestbuf++;
1050186 5:34d84609dd60 89 *pdestbuf = hex_to_char_tbl[((int32_t)*psrcbuf) % MASK_HEX10];
1050186 5:34d84609dd60 90 pdestbuf++;
1050186 5:34d84609dd60 91
1050186 5:34d84609dd60 92 psrcbuf++;
1050186 5:34d84609dd60 93 length--;
dkato 7:c45ecff1b44d 94 if (length != 0) {
dkato 7:c45ecff1b44d 95 *pdestbuf = ',';
dkato 7:c45ecff1b44d 96 pdestbuf++;
dkato 7:c45ecff1b44d 97 } else {
dkato 7:c45ecff1b44d 98 break;
dkato 7:c45ecff1b44d 99 }
1050186 5:34d84609dd60 100 }
1050186 5:34d84609dd60 101 *pdestbuf = CODE_NULL;
1050186 5:34d84609dd60 102 }
1050186 5:34d84609dd60 103 }
dkato 7:c45ecff1b44d 104
dkato 7:c45ecff1b44d 105 static int analysis_cmd(char * buf, char * p_reg_arg_buf) {
dkato 7:c45ecff1b44d 106 int arg_cnt = 0;
dkato 7:c45ecff1b44d 107 int byte_cnt = 0;
dkato 7:c45ecff1b44d 108 int retval;
dkato 7:c45ecff1b44d 109 char * psrcbuf = buf;
dkato 7:c45ecff1b44d 110 int ret;
1050186 5:34d84609dd60 111
dkato 7:c45ecff1b44d 112 if (strncmp(psrcbuf, STR_WR, sizeof(STR_WR) - 1) == 0) {
dkato 7:c45ecff1b44d 113 ret = REQ_WR;
dkato 7:c45ecff1b44d 114 psrcbuf += sizeof(STR_WR) - 1;
dkato 7:c45ecff1b44d 115 } else if (strncmp(psrcbuf, STR_RD, sizeof(STR_RD) - 1) == 0) {
dkato 7:c45ecff1b44d 116 ret = REQ_RD;
dkato 7:c45ecff1b44d 117 psrcbuf += sizeof(STR_RD) - 1;
dkato 7:c45ecff1b44d 118 } else if (strncmp(psrcbuf, STR_WR_NO_P, sizeof(STR_WR_NO_P) - 1) == 0) {
dkato 7:c45ecff1b44d 119 ret = REQ_WR_NO_P;
dkato 7:c45ecff1b44d 120 psrcbuf += sizeof(STR_WR_NO_P) - 1;
dkato 7:c45ecff1b44d 121 } else if (strncmp(psrcbuf, STR_RD_NO_P, sizeof(STR_RD_NO_P) - 1) == 0) {
dkato 7:c45ecff1b44d 122 ret = REQ_RD_NO_P;
dkato 7:c45ecff1b44d 123 psrcbuf += sizeof(STR_RD_NO_P) - 1;
dkato 7:c45ecff1b44d 124 } else {
dkato 7:c45ecff1b44d 125 ret = REQ_NONE;
1050186 5:34d84609dd60 126 }
1050186 5:34d84609dd60 127
dkato 7:c45ecff1b44d 128 if (ret != REQ_NONE) {
dkato 7:c45ecff1b44d 129 /* get argument(Reqest, I2C addr, len, data1, data2, data3, ...) */
dkato 7:c45ecff1b44d 130 p_reg_arg_buf[arg_cnt] = ret;
dkato 7:c45ecff1b44d 131 arg_cnt++;
1050186 5:34d84609dd60 132 byte_cnt = 0;
1050186 5:34d84609dd60 133 while (((int32_t)*psrcbuf) != CODE_NULL) {
dkato 7:c45ecff1b44d 134 retval = str_to_hex(psrcbuf, &p_reg_arg_buf[arg_cnt], byte_cnt);
dkato 7:c45ecff1b44d 135 if (retval != false) {
1050186 5:34d84609dd60 136 byte_cnt++;
1050186 5:34d84609dd60 137 if (byte_cnt >= ARG_MAX_SIZE) {
1050186 5:34d84609dd60 138 if ((arg_cnt + 1) >= ARG_MAX_NUM) {
dkato 7:c45ecff1b44d 139 ret = REQ_NONE;
dkato 7:c45ecff1b44d 140 break;
1050186 5:34d84609dd60 141 } else {
1050186 5:34d84609dd60 142 arg_cnt++;
1050186 5:34d84609dd60 143 byte_cnt = 0;
1050186 5:34d84609dd60 144 }
1050186 5:34d84609dd60 145 }
1050186 5:34d84609dd60 146 }
dkato 7:c45ecff1b44d 147 psrcbuf++;
1050186 5:34d84609dd60 148 }
1050186 5:34d84609dd60 149 }
1050186 5:34d84609dd60 150
dkato 7:c45ecff1b44d 151 return ret;
1050186 5:34d84609dd60 152 }
1050186 5:34d84609dd60 153
dkato 7:c45ecff1b44d 154 static void execute_cmd(char * buf, char * p_reg_arg_buf) {
dkato 7:c45ecff1b44d 155 int ret;
dkato 7:c45ecff1b44d 156 size_t len;
dkato 7:c45ecff1b44d 157 int stop = 0;
1050186 5:34d84609dd60 158
1050186 5:34d84609dd60 159 /* check request */
dkato 7:c45ecff1b44d 160 if ((p_reg_arg_buf[OFS_REQ] == REQ_WR_NO_P) || (p_reg_arg_buf[OFS_REQ] == REQ_RD_NO_P)) {
dkato 7:c45ecff1b44d 161 stop = 1;
dkato 7:c45ecff1b44d 162 }
1050186 5:34d84609dd60 163
dkato 7:c45ecff1b44d 164 switch (p_reg_arg_buf[OFS_REQ]) {
dkato 7:c45ecff1b44d 165 case REQ_WR:
dkato 7:c45ecff1b44d 166 case REQ_WR_NO_P:
dkato 7:c45ecff1b44d 167 ret = i2c.write(p_reg_arg_buf[OFS_I2C_ADDR], &p_reg_arg_buf[OFS_DATA], p_reg_arg_buf[OFS_DATA_SIZE], stop);
dkato 7:c45ecff1b44d 168 if (ret == 0) {
dkato 7:c45ecff1b44d 169 sprintf(buf, "OK");
dkato 7:c45ecff1b44d 170 }
dkato 7:c45ecff1b44d 171 break;
dkato 7:c45ecff1b44d 172 case REQ_RD:
dkato 7:c45ecff1b44d 173 case REQ_RD_NO_P:
dkato 7:c45ecff1b44d 174 ret = i2c.read(p_reg_arg_buf[OFS_I2C_ADDR], &p_reg_arg_buf[OFS_DATA], p_reg_arg_buf[OFS_DATA_SIZE], stop);
dkato 7:c45ecff1b44d 175 if (ret == 0) {
dkato 7:c45ecff1b44d 176 sprintf(buf, "OK ");
dkato 7:c45ecff1b44d 177 len = strlen(buf);
dkato 7:c45ecff1b44d 178 char_to_16char(&buf[len], &p_reg_arg_buf[OFS_DATA], p_reg_arg_buf[OFS_DATA_SIZE]);
dkato 7:c45ecff1b44d 179 }
dkato 7:c45ecff1b44d 180 break;
dkato 7:c45ecff1b44d 181 default:
dkato 7:c45ecff1b44d 182 case REQ_NONE:
dkato 7:c45ecff1b44d 183 ret = -1;
dkato 7:c45ecff1b44d 184 break;
dkato 7:c45ecff1b44d 185 }
dkato 7:c45ecff1b44d 186 if (ret != 0) {
dkato 7:c45ecff1b44d 187 sprintf(buf, "NG");
1050186 5:34d84609dd60 188 }
1050186 5:34d84609dd60 189 }
1050186 5:34d84609dd60 190
dkato 7:c45ecff1b44d 191 bool i2c_setting_exe(char * buf) {
1050186 5:34d84609dd60 192 int reg_arg_cnt;
dkato 7:c45ecff1b44d 193 char reg_arg_buf[ARG_MAX_NUM] = {0};
1050186 5:34d84609dd60 194
1050186 5:34d84609dd60 195 /* analysis command */
dkato 7:c45ecff1b44d 196 reg_arg_cnt = analysis_cmd(buf, reg_arg_buf);
dkato 7:c45ecff1b44d 197 if (reg_arg_cnt != REQ_NONE) {
dkato 7:c45ecff1b44d 198 /* check length */
dkato 7:c45ecff1b44d 199 if (reg_arg_buf[OFS_DATA_SIZE] >= DATA_MAX_SIZE) {
dkato 7:c45ecff1b44d 200 reg_arg_buf[OFS_DATA_SIZE] = DATA_MAX_SIZE;
dkato 7:c45ecff1b44d 201 }
1050186 5:34d84609dd60 202 /* execute command */
dkato 7:c45ecff1b44d 203 execute_cmd(buf, reg_arg_buf);
dkato 7:c45ecff1b44d 204 return true;
1050186 5:34d84609dd60 205 }
dkato 7:c45ecff1b44d 206
dkato 7:c45ecff1b44d 207 return false;
1050186 5:34d84609dd60 208 }
1050186 5:34d84609dd60 209
dkato 7:c45ecff1b44d 210 #if(0) /* Please enable this line when performing the setting from the Terminal side. */
dkato 7:c45ecff1b44d 211 Serial terminal(USBTX, USBRX);
dkato 7:c45ecff1b44d 212 static char recv_term_buffer[I2C_SETTING_STR_BUF_SIZE];
dkato 7:c45ecff1b44d 213
1050186 5:34d84609dd60 214 void SetI2CfromTerm(void const *argument) {
dkato 7:c45ecff1b44d 215 int32_t term_buf_offset = 0;
dkato 7:c45ecff1b44d 216 char recv_data;
1050186 5:34d84609dd60 217
1050186 5:34d84609dd60 218 while (1) {
dkato 7:c45ecff1b44d 219 recv_data = terminal.getc();
dkato 7:c45ecff1b44d 220 /* echo back */
dkato 7:c45ecff1b44d 221 printf("%c", recv_data);
dkato 7:c45ecff1b44d 222 switch ((int32_t)recv_data) {
dkato 7:c45ecff1b44d 223 case 0x0A :
dkato 7:c45ecff1b44d 224 recv_term_buffer[term_buf_offset] = CODE_NULL;
dkato 7:c45ecff1b44d 225 term_buf_offset = 0;
dkato 7:c45ecff1b44d 226 /* command analysis and execute */
dkato 7:c45ecff1b44d 227 if (i2c_setting_exe(recv_term_buffer) != false) {
dkato 7:c45ecff1b44d 228 terminal.puts(recv_term_buffer);
dkato 7:c45ecff1b44d 229 }
dkato 7:c45ecff1b44d 230 break;
dkato 7:c45ecff1b44d 231 case 0x0D :
dkato 7:c45ecff1b44d 232 /* Do Nothing */
dkato 7:c45ecff1b44d 233 break;
dkato 7:c45ecff1b44d 234 default :
dkato 7:c45ecff1b44d 235 /* check data_buffer size */
dkato 7:c45ecff1b44d 236 if (term_buf_offset < I2C_SETTING_STR_BUF_SIZE) {
dkato 7:c45ecff1b44d 237 recv_term_buffer[term_buf_offset] = recv_data;
dkato 7:c45ecff1b44d 238 term_buf_offset++;
dkato 7:c45ecff1b44d 239 }
dkato 7:c45ecff1b44d 240 break;
1050186 5:34d84609dd60 241 }
1050186 5:34d84609dd60 242 }
1050186 5:34d84609dd60 243 }
dkato 7:c45ecff1b44d 244 #endif
1050186 5:34d84609dd60 245