14 uint8_t calculated_bcc;
17 const char *separator =
"\x0D\x0A";
19 const char *separator =
")";
21 const char *stx =
"\x02";
22 const char *etx =
"\x21\x0D\x0A\x03";
26 char *register_list_string_ptr;
27 char *rid_value_unit_string_ptr;
30 size_t rid_string_length;
31 size_t value_string_length;
32 size_t unit_string_length;
33 size_t customer_no_string_length;
42 bcc = frame[frame_length - 1];
45 if (frame[i] == 0x02) {
50 calculated_bcc += frame[i];
51 calculated_bcc &= 0x7f;
53 if (frame[i] == 0x03) {
55 if (bcc == calculated_bcc) {
73 memcpy(register_list_string, frame, length);
78 register_list_string_ptr = register_list_string;
79 while ((pos =
strstr(register_list_string_ptr, separator)) !=
NULL) {
81 length = pos - register_list_string_ptr;
83 length = pos - register_list_string_ptr + 1;
86 memcpy(rid_value_unit_string, register_list_string_ptr, length);
87 rid_value_unit_string_ptr = rid_value_unit_string;
90 pos =
strstr(rid_value_unit_string,
"(");
92 rid_string_length = pos - rid_value_unit_string;
94 memcpy(rid, rid_value_unit_string, rid_string_length);
95 rid_value_unit_string_ptr += rid_string_length + 1;
97 pos =
strstr(rid_value_unit_string_ptr,
"*");
99 value_string_length = pos - rid_value_unit_string_ptr;
102 rid_value_unit_string_ptr += value_string_length + 1;
104 pos =
strstr(rid_value_unit_string_ptr,
")");
106 if (
strncmp(rid,
"0", 1) == 0) {
108 customer_no_string_length = pos - rid_value_unit_string_ptr;
110 memcpy(response->
customer_no, rid_value_unit_string_ptr, customer_no_string_length);
113 unit_string_length = pos - rid_value_unit_string_ptr;
120 register_list_string_ptr += length + 2;
122 register_list_string_ptr += length;
128 length =
strlen(register_list_string_ptr);
130 memcpy(rid_value_unit_string, register_list_string_ptr, length);
131 rid_value_unit_string_ptr = rid_value_unit_string;
134 pos =
strstr(rid_value_unit_string,
"(");
136 rid_string_length = pos - rid_value_unit_string;
138 memcpy(rid, rid_value_unit_string, rid_string_length);
139 rid_value_unit_string_ptr += rid_string_length + 1;
141 pos =
strstr(rid_value_unit_string_ptr,
"*");
143 value_string_length = pos - rid_value_unit_string_ptr;
146 rid_value_unit_string_ptr += value_string_length + 1;
148 pos =
strstr(rid_value_unit_string_ptr,
")");
150 if (
strncmp(rid,
"0", 1) == 0) {
152 customer_no_string_length = pos - rid_value_unit_string_ptr;
154 memcpy(response->
customer_no, rid_value_unit_string_ptr, customer_no_string_length);
157 unit_string_length = pos - rid_value_unit_string_ptr;
177 p = strtok(frame,
" ");
207 p = strtok(
NULL,
" ");
219 p = strtok(frame,
" ");
224 memset(value, 0,
sizeof(value));
229 memset(value, 0,
sizeof(value));
230 memcpy(value, p + 2 + 1, 1);
234 memset(value, 0,
sizeof(value));
235 memcpy(value, p + 2 + 2, 3);
240 memset(value, 0,
sizeof(value));
245 memset(value, 0,
sizeof(value));
250 memset(value, 0,
sizeof(value));
255 memset(value, 0,
sizeof(value));
261 p = strtok(
NULL,
" ");
274 p = strtok(frame,
" ");
284 p = strtok(
NULL,
" ");
301 memcpy(value_copy, value, value_length);
302 value_copy[value_length] = 0;
329 memcpy(unit_copy, unit, unit_length);
330 unit_copy[unit_length] = 0;
en61107_response_register_t effect1
unsigned int frame_length
en61107_response_register_t hr
en61107_response_register_t e1
char frame[EN61107_FRAME_L]
ICACHE_FLASH_ATTR bool parse_mc66cde_standard_data_1_frame(en61107_response_t *response, char *frame, unsigned int frame_length)
ICACHE_FLASH_ATTR void divide_str_by_10(char *str, char *decimal_str)
en61107_response_t response
ICACHE_FLASH_ATTR bool parse_mc66cde_inst_values_frame(en61107_response_t *response, char *frame, unsigned int frame_length)
en61107_response_register_t flow1
#define ICACHE_FLASH_ATTR
char value[EN61107_VALUE_L]
ICACHE_FLASH_ATTR void en61107_response_set_unit(en61107_response_t *response, char *rid, char *unit, unsigned int unit_length)
char meter_type[EN61107_METER_TYPE_L]
en61107_response_register_t t3
en61107_response_register_t t1
en61107_response_register_t v1
en61107_response_register_t t2
ICACHE_FLASH_ATTR bool parse_mc66cde_standard_data_2_frame(en61107_response_t *response, char *frame, unsigned int frame_length)
char unit[EN61107_UNIT_L]
en61107_response_register_t tdif
ICACHE_FLASH_ATTR void en61107_response_set_value(en61107_response_t *response, char *rid, char *value, unsigned int value_length)
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
en61107_meter_program_t meter_program
ICACHE_FLASH_ATTR bool parse_en61107_frame(en61107_response_t *response, char *frame, unsigned int frame_length)
#define EN61107_REGISTER_L
ICACHE_FLASH_ATTR void cleanup_decimal_str(char *decimal_str, char *cleaned_up_str, unsigned int length)
#define EN61107_CUSTOMER_NO_L
char customer_no[EN61107_CUSTOMER_NO_L]
ICACHE_FLASH_ATTR void divide_str_by_100(char *str, char *decimal_str)
#define EN61107_METER_TYPE_L