89 #define KMP_START_BYTE_IDX 0 92 #define KMP_DATA_IDX 3 183 uint8_t register_high;
184 uint8_t register_low;
187 if (register_list_length > 8) {
189 register_list_length = 8;
211 for (i = 0; i < register_list_length; i++) {
212 register_high = (uint8_t)(register_list[i] >> 8);
213 register_low = (uint8_t)(register_list[i] & 0xff);
236 #pragma mark - KMP Decoder 240 uint16_t kmp_frame_crc16;
243 unsigned int kmp_register_idx;
284 if (kmp_frame_crc16 == crc16) {
349 #pragma mark - Helper methods 368 int8_t sign_i = (si_ex & 0x80) >> 7;
369 int8_t sign_e = (si_ex & 0x40) >> 6;
370 int8_t exponent = (si_ex & 0x3f);
375 result = -1 * value /
int_pow(10, exponent);
378 result = -1 * value *
int_pow(10, exponent);
383 result = value / (double)
int_pow(10, exponent);
386 result = value * (double)
int_pow(10, exponent);
396 uint32_t result_int, result_frac;
397 int8_t sign_i = (si_ex & 0x80) >> 7;
398 int8_t sign_e = (si_ex & 0x40) >> 6;
399 int8_t exponent = (si_ex & 0x3f);
401 unsigned char leading_zeroes[16];
404 factor =
int_pow(10, exponent);
407 result = value /
int_pow(10, exponent);
408 result_int = (int32_t)result;
409 result_frac = value - result_int *
int_pow(10, exponent);
412 strcpy(leading_zeroes,
"");
414 strcat(leading_zeroes,
"0");
416 tfp_snprintf(value_string, 23 + i,
"-%u.%s%u", result_int, leading_zeroes, result_frac);
424 result = value /
int_pow(10, exponent);
425 result_int = (int32_t)result;
426 result_frac = value - result_int *
int_pow(10, exponent);
429 strcpy(leading_zeroes,
"");
431 strcat(leading_zeroes,
"0");
433 tfp_snprintf(value_string, 22 + i,
"%u.%s%u", result_int, leading_zeroes, result_frac);
445 strcpy(unit_string,
"Wh");
448 strcpy(unit_string,
"kWh");
451 strcpy(unit_string,
"MWh");
454 strcpy(unit_string,
"Gj");
457 strcpy(unit_string,
"Gcal");
460 strcpy(unit_string,
"kW");
463 strcpy(unit_string,
"MW");
475 strcpy(unit_string,
"m3");
478 strcpy(unit_string,
"l/h");
481 strcpy(unit_string,
"m3/h");
484 strcpy(unit_string,
"m3xC");
487 strcpy(unit_string,
"ton");
490 strcpy(unit_string,
"ton/h");
496 strcpy(unit_string,
"clock");
499 strcpy(unit_string,
"date1");
502 strcpy(unit_string,
"date3");
505 strcpy(unit_string,
"number");
508 strcpy(unit_string,
"bar");
589 stuffed_data[j++] = 0x1b;
609 unstuffed_data[j++] =
kmp_frame[i + 1] ^ 0xff;
ICACHE_FLASH_ATTR int kmp_decode_frame(unsigned char *frame, unsigned char frame_length, kmp_response_t *response)
unsigned int frame_length
char frame[EN61107_FRAME_L]
unsigned int kmp_frame_length
unsigned int kmp_response_meter_type
ICACHE_FLASH_ATTR unsigned int kmp_set_clock(unsigned char *frame, uint64_t unix_time)
en61107_response_t response
ICACHE_FLASH_ATTR unsigned int decimal_number_length(int n)
ICACHE_FLASH_ATTR uint16_t kmp_crc16()
#define ICACHE_FLASH_ATTR
ICACHE_FLASH_ATTR void kmp_unit_to_string(uint8_t unit, unsigned char *unit_string)
unsigned int kmp_response_sw_revision
ICACHE_FLASH_ATTR void kmp_byte_unstuff()
ICACHE_FLASH_ATTR double kmp_value_to_double(int32_t value, uint8_t si_ex)
unsigned int kmp_data_length
ICACHE_FLASH_ATTR void kmp_value_to_string(int32_t value, uint8_t si_ex, unsigned char *value_string)
ICACHE_FLASH_ATTR void kmp_byte_stuff()
ICACHE_FLASH_ATTR uint16_t ccit_crc16(uint16_t crc16, uint8_t *data_p, unsigned int length)
kmp_response_register_list_t kmp_response_register_list
kmp_response_t * kmp_response
unsigned char * kmp_frame
#define KMP_START_BYTE_IDX
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
uint16_t register_list[8]
ICACHE_FLASH_ATTR unsigned int kmp_get_serial(unsigned char *frame)
ICACHE_FLASH_ATTR unsigned int kmp_get_register(unsigned char *frame, uint16_t *register_list, uint16_t register_list_length)
ICACHE_FLASH_ATTR int int_pow(int x, int y)
ICACHE_FLASH_ATTR unsigned int kmp_get_type(unsigned char *frame)
unsigned int kmp_response_serial