MeterLogger
Macros | Functions | Variables
kmp.c File Reference
#include <esp8266.h>
#include <utils.h>
#include "tinyprintf.h"
#include "kmp.h"
Include dependency graph for kmp.c:

Go to the source code of this file.

Macros

#define KMP_START_BYTE_IDX   0
 
#define KMP_DST_IDX   1
 
#define KMP_CID_IDX   2
 
#define KMP_DATA_IDX   3
 

Functions

ICACHE_FLASH_ATTR unsigned int kmp_get_type (unsigned char *frame)
 
ICACHE_FLASH_ATTR unsigned int kmp_get_serial (unsigned char *frame)
 
ICACHE_FLASH_ATTR unsigned int kmp_set_clock (unsigned char *frame, uint64_t unix_time)
 
ICACHE_FLASH_ATTR unsigned int kmp_get_register (unsigned char *frame, uint16_t *register_list, uint16_t register_list_length)
 
ICACHE_FLASH_ATTR int kmp_decode_frame (unsigned char *frame, unsigned char frame_length, kmp_response_t *response)
 
ICACHE_FLASH_ATTR uint16_t kmp_crc16 ()
 
ICACHE_FLASH_ATTR double kmp_value_to_double (int32_t value, uint8_t si_ex)
 
ICACHE_FLASH_ATTR void kmp_value_to_string (int32_t value, uint8_t si_ex, unsigned char *value_string)
 
ICACHE_FLASH_ATTR void kmp_unit_to_string (uint8_t unit, unsigned char *unit_string)
 
ICACHE_FLASH_ATTR void kmp_byte_stuff ()
 
ICACHE_FLASH_ATTR void kmp_byte_unstuff ()
 

Variables

unsigned char * kmp_frame
 
unsigned int kmp_frame_length
 
unsigned int kmp_data_length
 
kmp_response_tkmp_response
 

Macro Definition Documentation

◆ KMP_CID_IDX

#define KMP_CID_IDX   2

Definition at line 91 of file kmp.c.

Referenced by kmp_decode_frame(), kmp_get_register(), kmp_get_serial(), and kmp_get_type().

◆ KMP_DATA_IDX

#define KMP_DATA_IDX   3

Definition at line 92 of file kmp.c.

Referenced by kmp_decode_frame(), and kmp_get_register().

◆ KMP_DST_IDX

#define KMP_DST_IDX   1

◆ KMP_START_BYTE_IDX

#define KMP_START_BYTE_IDX   0

Definition at line 89 of file kmp.c.

Referenced by kmp_get_register(), kmp_get_serial(), and kmp_get_type().

Function Documentation

◆ kmp_byte_stuff()

ICACHE_FLASH_ATTR void kmp_byte_stuff ( )

Definition at line 580 of file kmp.c.

References ICACHE_FLASH_ATTR, kmp_data_length, KMP_DST_IDX, kmp_frame, KMP_FRAME_L, kmp_frame_length, memcpy, and memset.

Referenced by kmp_get_register(), kmp_get_serial(), and kmp_get_type().

580  {
581  unsigned char stuffed_data[KMP_FRAME_L];
582  unsigned int i;
583  unsigned int j = 0;
584 
585  memset(stuffed_data, 0x00, KMP_FRAME_L);
586 
587  for (i = KMP_DST_IDX; i < (kmp_frame_length); i++) {
588  if ((kmp_frame[i] == 0x80) || (kmp_frame[i] == 0x40) || (kmp_frame[i] == 0x0d) || (kmp_frame[i] == 0x06) || (kmp_frame[i] == 0x1b)) {
589  stuffed_data[j++] = 0x1b;
590  stuffed_data[j++] = kmp_frame[i] ^ 0xff;
591  }
592  else {
593  stuffed_data[j++] = kmp_frame[i];
594  }
595  }
596  memcpy(kmp_frame + KMP_DST_IDX, stuffed_data, j);
598  kmp_data_length = j;
599 }
#define memset(x, a, b)
Definition: platform.h:21
unsigned int kmp_frame_length
Definition: kmp.c:95
#define KMP_DST_IDX
Definition: kmp.c:90
unsigned int kmp_data_length
Definition: kmp.c:96
unsigned char * kmp_frame
Definition: kmp.c:94
#define memcpy(x, a, b)
Definition: platform.h:22
#define KMP_FRAME_L
Definition: kmp.h:2
Here is the caller graph for this function:

◆ kmp_byte_unstuff()

ICACHE_FLASH_ATTR void kmp_byte_unstuff ( )

Definition at line 602 of file kmp.c.

References kmp_data_length, KMP_DST_IDX, kmp_frame, KMP_FRAME_L, kmp_frame_length, and memcpy.

Referenced by kmp_decode_frame().

602  {
603  unsigned char unstuffed_data[KMP_FRAME_L];
604  unsigned int i;
605  unsigned int j = 0;
606 
607  for (i = KMP_DST_IDX; i < kmp_frame_length; i++) {
608  if (kmp_frame[i] == 0x1b) { // byte unstuffing special char
609  unstuffed_data[j++] = kmp_frame[i + 1] ^ 0xff;
610  i++;
611  }
612  else {
613  unstuffed_data[j++] = kmp_frame[i];
614  }
615  }
616  memcpy(kmp_frame + KMP_DST_IDX, unstuffed_data, j);
617  kmp_frame_length = j + KMP_DST_IDX;
618  kmp_data_length = j;
619 }
unsigned int kmp_frame_length
Definition: kmp.c:95
#define KMP_DST_IDX
Definition: kmp.c:90
unsigned int kmp_data_length
Definition: kmp.c:96
unsigned char * kmp_frame
Definition: kmp.c:94
#define memcpy(x, a, b)
Definition: platform.h:22
#define KMP_FRAME_L
Definition: kmp.h:2
Here is the caller graph for this function:

◆ kmp_crc16()

ICACHE_FLASH_ATTR uint16_t kmp_crc16 ( )

Definition at line 352 of file kmp.c.

References ccit_crc16(), ICACHE_FLASH_ATTR, kmp_data_length, KMP_DST_IDX, and kmp_frame.

Referenced by kmp_decode_frame(), kmp_get_register(), kmp_get_serial(), and kmp_get_type().

352  {
353  //uint16_t crc16;
354  //int i;
355 
356  //crc16 = 0;
357  //for (i = KMP_DST_IDX; i < (kmp_data_length + KMP_DST_IDX); i++) {
358  // crc16 = (crc16 << 8) ^ kmp_crc16_table[((crc16 >> 8) ^ kmp_frame[i]) & 0x00FF];
359  //}
360  //return crc16;
361 
362  return ccit_crc16(0x0000, kmp_frame + KMP_DST_IDX, kmp_data_length);
363 }
#define KMP_DST_IDX
Definition: kmp.c:90
unsigned int kmp_data_length
Definition: kmp.c:96
ICACHE_FLASH_ATTR uint16_t ccit_crc16(uint16_t crc16, uint8_t *data_p, unsigned int length)
Definition: utils.c:47
unsigned char * kmp_frame
Definition: kmp.c:94
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kmp_decode_frame()

ICACHE_FLASH_ATTR int kmp_decode_frame ( unsigned char *  frame,
unsigned char  frame_length,
kmp_response_t response 
)

Definition at line 239 of file kmp.c.

References frame, frame_length, ICACHE_FLASH_ATTR, kmp_byte_unstuff(), KMP_CID_IDX, kmp_crc16(), KMP_DATA_IDX, kmp_data_length, kmp_frame, kmp_frame_length, kmp_response_t::kmp_response_meter_type, kmp_response_t::kmp_response_register_list, kmp_response_t::kmp_response_serial, kmp_response_t::kmp_response_sw_revision, memset, and response.

Referenced by kmp_received_task().

239  {
240  uint16_t kmp_frame_crc16;
241  uint16_t crc16;
242  unsigned int i;
243  unsigned int kmp_register_idx;
244 
245  kmp_frame = frame;
247 
249  memset(kmp_response, 0x00, sizeof(kmp_response_t));
250 
251  if (kmp_frame_length == 0) {
252  return 0;
253  }
254 
255  if (kmp_frame_length == 1) {
256  // no data returned from Kamstrup meter
257  if (kmp_frame[kmp_frame_length - 1] == 0x06) {
258  return 0;
259  }
260  else {
261  // Kamstrup: device said: no valid reply from kamstrup meter
262  return 0;
263  }
264  }
265 
266  if (kmp_frame_length < 6) {
267  // valid packets are at least 1) start byte, 2) dst, 3) cid, 4) crc high, 5) crc low and 6) stop byte
268  return 0;
269  }
270 
271  if (kmp_frame[kmp_frame_length - 1] == 0x0d) {
272  // end of data - get params from frame
273  // no need to set start and stop bytes
274 
275  // unstuff data
277 
278  // calculate crc
279  kmp_data_length = kmp_frame_length - 4; // not included 1) start_byte, 2) crc high, 3) crc low and 4) stop byte
280  crc16 = kmp_crc16();
281 
282  // get crc from frame
283  kmp_frame_crc16 = (kmp_frame[kmp_frame_length - 2] | kmp_frame[kmp_frame_length - 3] << 8);
284  if (kmp_frame_crc16 == crc16) {
285  //crc ok
286  }
287  else {
288  //crc error
289  return -1;
290  }
291 
292  // decode application layer
293 
294  if (kmp_frame[KMP_CID_IDX] == 0x01) {
295  // kmp_get_type
298  return 1;
299  }
300  else if (kmp_frame[KMP_CID_IDX] == 0x02) {
301  // kmp_get_serial
303  return 1;
304  }
305  else if (kmp_frame[KMP_CID_IDX] == 0x10) {
306  // kmp_get_register
307  if (kmp_data_length > 2) {
308  for (i = 0; i < ((kmp_data_length - 2) / 9); i++) { // 9 bytes per register. BUG here if length != 4?
309  kmp_register_idx = 9 * i + KMP_DATA_IDX;
310 
311  // rid
312  kmp_response->kmp_response_register_list[i].rid = (kmp_frame[kmp_register_idx + 0] << 8) + kmp_frame[kmp_register_idx + 1];
313 
314  // unit
315  kmp_response->kmp_response_register_list[i].unit = kmp_frame[kmp_register_idx + 2];
316 
317  // length
318  kmp_response->kmp_response_register_list[i].length = kmp_frame[kmp_register_idx + 3];
319 
320  // si_ex
321  kmp_response->kmp_response_register_list[i].si_ex = kmp_frame[kmp_register_idx + 4];
322 
323  // value
324  kmp_response->kmp_response_register_list[i].value = (kmp_frame[kmp_register_idx + 5] << 24) + (kmp_frame[kmp_register_idx + 6] << 16) + (kmp_frame[kmp_register_idx + 7] << 8) + kmp_frame[kmp_register_idx + 8];
325  }
326  return 1;
327  }
328  else {
329  // No registers in reply
330  return 0;
331  }
332  }
333  else if (kmp_frame[KMP_CID_IDX] == 0x11) {
334  // kmp_put_register
335  //range = NSMakeRange(2, data.length - 2);
336  //NSLog(@"%@", [data subdataWithRange:range]);
337  return 1;
338  }
339 //
340  }
341  else if (kmp_frame[kmp_frame_length - 1] == 0x06) {
342  // kmp_set_clock no CRC
343  return 0;
344  }
345 
346  return 0;
347 }
unsigned int frame_length
#define KMP_CID_IDX
Definition: kmp.c:91
#define memset(x, a, b)
Definition: platform.h:21
char frame[EN61107_FRAME_L]
unsigned int kmp_frame_length
Definition: kmp.c:95
unsigned int kmp_response_meter_type
Definition: kmp.h:16
en61107_response_t response
ICACHE_FLASH_ATTR uint16_t kmp_crc16()
Definition: kmp.c:352
unsigned int kmp_response_sw_revision
Definition: kmp.h:17
ICACHE_FLASH_ATTR void kmp_byte_unstuff()
Definition: kmp.c:602
unsigned int kmp_data_length
Definition: kmp.c:96
kmp_response_register_list_t kmp_response_register_list
Definition: kmp.h:18
kmp_response_t * kmp_response
Definition: kmp.c:99
unsigned char * kmp_frame
Definition: kmp.c:94
#define KMP_DATA_IDX
Definition: kmp.c:92
unsigned int kmp_response_serial
Definition: kmp.h:15
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kmp_get_register()

ICACHE_FLASH_ATTR unsigned int kmp_get_register ( unsigned char *  frame,
uint16_t *  register_list,
uint16_t  register_list_length 
)

Definition at line 181 of file kmp.c.

References frame, ICACHE_FLASH_ATTR, kmp_byte_stuff(), KMP_CID_IDX, kmp_crc16(), KMP_DATA_IDX, kmp_data_length, KMP_DST_IDX, kmp_frame, KMP_FRAME_L, kmp_frame_length, KMP_START_BYTE_IDX, and memset.

Referenced by kmp_get_register_timer_func().

181  {
182  unsigned int i;
183  uint8_t register_high;
184  uint8_t register_low;
185  uint16_t crc16;
186 
187  if (register_list_length > 8) {
188  // maximal number of 8 registers can be read with one request, last ones ommitted
189  register_list_length = 8;
190  }
191 
192  // clear frame
193  kmp_frame = frame;
194  memset(kmp_frame, 0x00, KMP_FRAME_L);
195  kmp_frame_length = 0;
196  kmp_data_length = 0;
197 
198  // start byte
200 
201  // data
202  kmp_frame[KMP_DST_IDX] = 0x3f;
203  kmp_frame[KMP_CID_IDX] = 0x10;
204 
205  // number of registers
206  kmp_frame[KMP_DATA_IDX] = register_list_length;
207  kmp_frame_length = 4;
208  kmp_data_length = 3;
209 
210  // registers
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);
214  kmp_frame[KMP_DATA_IDX + 2 * i + 1] = register_high;
215  kmp_frame[KMP_DATA_IDX + 2 * i + 2] = register_low;
216  }
217  kmp_frame_length += 2 * i;
218  kmp_data_length += 2 * i;
219 
220  // put crc 16 in frame
221  crc16 = kmp_crc16();
222  kmp_frame[kmp_frame_length] = crc16 >> 8; // high bits of crc16
223  kmp_frame[kmp_frame_length + 1] = crc16 & 0xff; // low bits
224  kmp_frame_length += 2;
225 
226  // stuff data
227  kmp_byte_stuff();
228 
229  // stop byte
230  kmp_frame[kmp_frame_length] = 0x0d;
232 
233  return kmp_frame_length;
234 }
#define KMP_CID_IDX
Definition: kmp.c:91
#define memset(x, a, b)
Definition: platform.h:21
char frame[EN61107_FRAME_L]
unsigned int kmp_frame_length
Definition: kmp.c:95
ICACHE_FLASH_ATTR uint16_t kmp_crc16()
Definition: kmp.c:352
#define KMP_DST_IDX
Definition: kmp.c:90
unsigned int kmp_data_length
Definition: kmp.c:96
ICACHE_FLASH_ATTR void kmp_byte_stuff()
Definition: kmp.c:580
unsigned char * kmp_frame
Definition: kmp.c:94
#define KMP_DATA_IDX
Definition: kmp.c:92
#define KMP_START_BYTE_IDX
Definition: kmp.c:89
uint16_t register_list[8]
Definition: kmp_request.c:27
#define KMP_FRAME_L
Definition: kmp.h:2
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kmp_get_serial()

ICACHE_FLASH_ATTR unsigned int kmp_get_serial ( unsigned char *  frame)

Definition at line 139 of file kmp.c.

References frame, ICACHE_FLASH_ATTR, kmp_byte_stuff(), KMP_CID_IDX, kmp_crc16(), kmp_data_length, KMP_DST_IDX, kmp_frame, KMP_FRAME_L, kmp_frame_length, KMP_START_BYTE_IDX, and memset.

Referenced by kmp_get_serial_timer_func().

139  {
140  uint16_t crc16;
141 
142  // clear frame
143  kmp_frame = frame;
144  memset(kmp_frame, 0x00, KMP_FRAME_L);
145  kmp_frame_length = 0;
146  kmp_data_length = 0;
147 
148  // start byte
150 
151  // data
152  kmp_frame[KMP_DST_IDX] = 0x3f;
153  kmp_frame[KMP_CID_IDX] = 0x02;
154  kmp_frame_length = 3;
155  kmp_data_length = 2;
156 
157  // put crc 16 in frame
158  crc16 = kmp_crc16();
159  kmp_frame[kmp_frame_length] = crc16 >> 8; // high bits of crc16
160  kmp_frame[kmp_frame_length + 1] = crc16 & 0xff; // low bits
161  kmp_frame_length += 2;
162  kmp_data_length += 2;
163 
164  // stuff data
165  kmp_byte_stuff();
166 
167  // stop byte
168  kmp_frame[kmp_frame_length] = 0x0d;
170 
171  return kmp_frame_length;
172 }
#define KMP_CID_IDX
Definition: kmp.c:91
#define memset(x, a, b)
Definition: platform.h:21
char frame[EN61107_FRAME_L]
unsigned int kmp_frame_length
Definition: kmp.c:95
ICACHE_FLASH_ATTR uint16_t kmp_crc16()
Definition: kmp.c:352
#define KMP_DST_IDX
Definition: kmp.c:90
unsigned int kmp_data_length
Definition: kmp.c:96
ICACHE_FLASH_ATTR void kmp_byte_stuff()
Definition: kmp.c:580
unsigned char * kmp_frame
Definition: kmp.c:94
#define KMP_START_BYTE_IDX
Definition: kmp.c:89
#define KMP_FRAME_L
Definition: kmp.h:2
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kmp_get_type()

ICACHE_FLASH_ATTR unsigned int kmp_get_type ( unsigned char *  frame)

Definition at line 103 of file kmp.c.

References frame, ICACHE_FLASH_ATTR, kmp_byte_stuff(), KMP_CID_IDX, kmp_crc16(), kmp_data_length, KMP_DST_IDX, kmp_frame, KMP_FRAME_L, kmp_frame_length, KMP_START_BYTE_IDX, and memset.

103  {
104  uint16_t crc16;
105 
106  // clear frame
107  kmp_frame = frame;
108  memset(kmp_frame, 0x00, KMP_FRAME_L);
109  kmp_frame_length = 0;
110  kmp_data_length = 0;
111 
112  // start byte
114 
115  // data
116  kmp_frame[KMP_DST_IDX] = 0x3f;
117  kmp_frame[KMP_CID_IDX] = 0x01;
118  kmp_frame_length = 3;
119  kmp_data_length = 2;
120 
121  // put crc 16 in frame
122  crc16 = kmp_crc16();
123  kmp_frame[kmp_frame_length] = crc16 >> 8; // high bits of crc16
124  kmp_frame[kmp_frame_length + 1] = crc16 & 0xff; // low bits
125  kmp_frame_length += 2;
126  kmp_data_length +=2;
127 
128  // stuff data
129  kmp_byte_stuff();
130 
131  // stop byte
132  kmp_frame[kmp_frame_length] = 0x0d;
134 
135  return kmp_frame_length;
136 }
#define KMP_CID_IDX
Definition: kmp.c:91
#define memset(x, a, b)
Definition: platform.h:21
char frame[EN61107_FRAME_L]
unsigned int kmp_frame_length
Definition: kmp.c:95
ICACHE_FLASH_ATTR uint16_t kmp_crc16()
Definition: kmp.c:352
#define KMP_DST_IDX
Definition: kmp.c:90
unsigned int kmp_data_length
Definition: kmp.c:96
ICACHE_FLASH_ATTR void kmp_byte_stuff()
Definition: kmp.c:580
unsigned char * kmp_frame
Definition: kmp.c:94
#define KMP_START_BYTE_IDX
Definition: kmp.c:89
#define KMP_FRAME_L
Definition: kmp.h:2
Here is the call graph for this function:

◆ kmp_set_clock()

ICACHE_FLASH_ATTR unsigned int kmp_set_clock ( unsigned char *  frame,
uint64_t  unix_time 
)

Definition at line 175 of file kmp.c.

References ICACHE_FLASH_ATTR.

175  {
176  // DEBUG: not implemented
177  return 0;
178 }

◆ kmp_unit_to_string()

ICACHE_FLASH_ATTR void kmp_unit_to_string ( uint8_t  unit,
unsigned char *  unit_string 
)

Definition at line 442 of file kmp.c.

References ICACHE_FLASH_ATTR, and strcpy.

Referenced by kmp_get_received_energy_kwh(), and kmp_received_task().

442  {
443  switch (unit) {
444  case 0x01:
445  strcpy(unit_string, "Wh");
446  break;
447  case 0x02:
448  strcpy(unit_string, "kWh");
449  break;
450  case 0x03:
451  strcpy(unit_string, "MWh");
452  break;
453  case 0x08:
454  strcpy(unit_string, "Gj");
455  break;
456  case 0x0c:
457  strcpy(unit_string, "Gcal");
458  break;
459  case 0x16:
460  strcpy(unit_string, "kW");
461  break;
462  case 0x17:
463  strcpy(unit_string, "MW");
464  break;
465  case 0x25:
466  strcpy(unit_string, "C");
467  break;
468  case 0x26:
469  strcpy(unit_string, "K");
470  break;
471  case 0x27:
472  strcpy(unit_string, "l");
473  break;
474  case 0x28:
475  strcpy(unit_string, "m3");
476  break;
477  case 0x29:
478  strcpy(unit_string, "l/h");
479  break;
480  case 0x2a:
481  strcpy(unit_string, "m3/h");
482  break;
483  case 0x2b:
484  strcpy(unit_string, "m3xC");
485  break;
486  case 0x2c:
487  strcpy(unit_string, "ton");
488  break;
489  case 0x2d:
490  strcpy(unit_string, "ton/h");
491  break;
492  case 0x2e:
493  strcpy(unit_string, "h");
494  break;
495  case 0x2f:
496  strcpy(unit_string, "clock");
497  break;
498  case 0x30:
499  strcpy(unit_string, "date1");
500  break;
501  case 0x32:
502  strcpy(unit_string, "date3");
503  break;
504  case 0x33:
505  strcpy(unit_string, "number");
506  break;
507  case 0x34:
508  strcpy(unit_string, "bar");
509  break;
510 
511  default:
512  break;
513  }
514 }
#define strcpy(a, b)
Definition: platform.h:15
Here is the caller graph for this function:

◆ kmp_value_to_double()

ICACHE_FLASH_ATTR double kmp_value_to_double ( int32_t  value,
uint8_t  si_ex 
)

Definition at line 366 of file kmp.c.

References ICACHE_FLASH_ATTR, and int_pow().

366  {
367  double result;
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);
371 
372  // powf(-1, (double)sign_i) * value * powf(10, (powf(-1, (double)sign_e) * exponent));
373  if (sign_i) {
374  if (sign_e) {
375  result = -1 * value / int_pow(10, exponent);
376  }
377  else {
378  result = -1 * value * int_pow(10, exponent);
379  }
380  }
381  else {
382  if (sign_e) {
383  result = value / (double)int_pow(10, exponent);
384  }
385  else {
386  result = value * (double)int_pow(10, exponent);
387  }
388  }
389 
390  return result;
391 }
ICACHE_FLASH_ATTR int int_pow(int x, int y)
Definition: utils.c:203
Here is the call graph for this function:

◆ kmp_value_to_string()

ICACHE_FLASH_ATTR void kmp_value_to_string ( int32_t  value,
uint8_t  si_ex,
unsigned char *  value_string 
)

Definition at line 394 of file kmp.c.

References decimal_number_length(), ICACHE_FLASH_ATTR, int_pow(), strcat, strcpy, and tfp_snprintf().

Referenced by kmp_get_received_energy_kwh(), and kmp_received_task().

394  {
395  double result;
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);
400  uint32_t factor;
401  unsigned char leading_zeroes[16];
402  unsigned int i;
403 
404  factor = int_pow(10, exponent);
405  if (sign_i) {
406  if (sign_e) {
407  result = value / int_pow(10, exponent);
408  result_int = (int32_t)result;
409  result_frac = value - result_int * int_pow(10, exponent);
410 
411  // prepare decimal string
412  strcpy(leading_zeroes, "");
413  for (i = 0; i < (exponent - decimal_number_length(result_frac)); i++) {
414  strcat(leading_zeroes, "0");
415  }
416  tfp_snprintf(value_string, 23 + i, "-%u.%s%u", result_int, leading_zeroes, result_frac);
417  }
418  else {
419  tfp_snprintf(value_string, 12, "-%u", value * factor);
420  }
421  }
422  else {
423  if (sign_e) {
424  result = value / int_pow(10, exponent);
425  result_int = (int32_t)result;
426  result_frac = value - result_int * int_pow(10, exponent);
427 
428  // prepare decimal string
429  strcpy(leading_zeroes, "");
430  for (i = 0; i < (exponent - decimal_number_length(result_frac)); i++) {
431  strcat(leading_zeroes, "0");
432  }
433  tfp_snprintf(value_string, 22 + i, "%u.%s%u", result_int, leading_zeroes, result_frac);
434  }
435  else {
436  tfp_snprintf(value_string, 11, "%u", value * factor);
437  }
438  }
439 }
#define strcat(a, b)
Definition: platform.h:23
ICACHE_FLASH_ATTR unsigned int decimal_number_length(int n)
Definition: utils.c:191
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
Definition: tinyprintf.c:480
#define strcpy(a, b)
Definition: platform.h:15
ICACHE_FLASH_ATTR int int_pow(int x, int y)
Definition: utils.c:203
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ kmp_data_length

unsigned int kmp_data_length

◆ kmp_frame

unsigned char* kmp_frame

◆ kmp_frame_length

unsigned int kmp_frame_length

◆ kmp_response

kmp_response_t* kmp_response

Definition at line 99 of file kmp.c.