test public

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

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