Renesas GR PEACH Contest 2017

Dependencies:   GR-PEACH_video GraphicsFramework HttpServer_snapshot_mbed-os LWIPBP3595Interface_STA_for_mbed-os R_BSP RomRamBlockDevice mbed-rpc

Committer:
fxanhkhoa
Date:
Sat Sep 30 08:40:38 2017 +0000
Revision:
1:95d6a59176fd
Parent:
0:1bccf2cddb03
Renesas GR PEACH Contest 2017

Who changed what in which revision?

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