31 #include "libsigrok-internal.h"
33 #define LOG_PREFIX "kern"
35 static int get_buflen(
const uint8_t *buf)
38 if (buf[12] ==
'\r' && buf[13] ==
'\n')
40 else if (buf[13] ==
'\r' && buf[14] ==
'\n')
46 static int parse_value(
const uint8_t *buf,
float *result,
47 const struct kern_info *info)
53 s2 = (info->buflen == 14) ? 11 : 12;
54 len = (info->buflen == 14) ? 8 : 9;
58 sr_spew(
"Over/under limit.");
63 strval = g_strndup((
const char *)buf, len);
64 floatval = g_ascii_strtod(strval, NULL);
71 static void parse_flags(
const uint8_t *buf,
struct kern_info *info)
75 u1 = (info->buflen == 14) ? 8 : 9;
76 u2 = (info->buflen == 14) ? 9 : 10;
77 s2 = (info->buflen == 14) ? 11 : 12;
80 info->is_gram = (buf[u1] ==
' ' && buf[u2] ==
'G');
81 info->is_carat = (buf[u1] ==
'C' && buf[u2] ==
'T');
82 info->is_ounce = (buf[u1] ==
'O' && buf[u2] ==
'Z');
83 info->is_pound = (buf[u1] ==
'L' && buf[u2] ==
'B');
84 info->is_troy_ounce = (buf[u1] ==
'O' && buf[u2] ==
'T');
85 info->is_pennyweight = (buf[u1] ==
'D' && buf[u2] ==
'W');
86 info->is_grain = (buf[u1] ==
'G' && buf[u2] ==
'R');
87 info->is_tael = (buf[u1] ==
'T' && buf[u2] ==
'L');
88 info->is_momme = (buf[u1] ==
'M' && buf[u2] ==
'O');
89 info->is_tola = (buf[u1] ==
't' && buf[u2] ==
'o');
90 info->is_percentage = (buf[u1] ==
' ' && buf[u2] ==
'%');
91 info->is_piece = (buf[u1] ==
'P' && buf[u2] ==
'C');
103 info->is_unstable = (buf[s2] ==
'U');
104 info->is_stable = (buf[s2] ==
'S');
105 info->is_error = (buf[s2] ==
'E');
114 const struct kern_info *info)
130 if (info->is_troy_ounce)
132 if (info->is_pennyweight)
142 if (info->is_percentage)
148 if (info->is_unstable)
154 int buflen, s1, s2, cr, lf;
156 if ((buflen = get_buflen(buf)) < 0)
159 s1 = (buflen == 14) ? 10 : 11;
160 s2 = (buflen == 14) ? 11 : 12;
161 cr = (buflen == 14) ? 12 : 13;
162 lf = (buflen == 14) ? 13 : 14;
165 if (buf[0] !=
'+' && buf[0] !=
'-' && buf[0] !=
' ')
169 if (buf[s1] !=
'L' && buf[s1] !=
'G' && buf[s1] !=
'H' && buf[s1] !=
' ')
173 if (buf[s2] !=
'U' && buf[s2] !=
'S' && buf[s2] !=
'E' && buf[s2] !=
' ')
178 if (buf[cr] !=
'\r' || buf[lf] !=
'\n')
203 struct kern_info *info_local;
205 info_local = (
struct kern_info *)info;
207 info_local->buflen = get_buflen(buf);
209 if ((ret = parse_value(buf, floatval, info_local)) !=
SR_OK) {
210 sr_dbg(
"Error parsing value: %d.", ret);
214 parse_flags(buf, info_local);
215 handle_flags(analog, floatval, info_local);
Analog datafeed payload for type SR_DF_ANALOG_OLD.
Pieces (number of items).
The public libsigrok header file to be used by frontends.
Mass in tael (variants: Hong Kong, Singapore/Malaysia, Taiwan)
Mass in pennyweight [dwt].
SR_PRIV int sr_kern_parse(const uint8_t *buf, float *floatval, struct sr_datafeed_analog_old *analog, void *info)
Parse a protocol packet.
Unstable value (hasn't settled yet).
uint64_t mqflags
Bitmap with extra information about the MQ.
int mq
Measured quantity (voltage, current, temperature, and so on).
int unit
Unit in which the MQ is measured.
SR_PRIV gboolean sr_kern_packet_valid(const uint8_t *buf)
Mass in troy ounce [oz t].