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);
Unstable value (hasn't settled yet).
int unit
Unit in which the MQ is measured.
Pieces (number of items).
int mq
Measured quantity (voltage, current, temperature, and so on).
Mass in tael (variants: Hong Kong, Singapore/Malaysia, Taiwan)
SR_PRIV gboolean sr_kern_packet_valid(const uint8_t *buf)
SR_PRIV int sr_kern_parse(const uint8_t *buf, float *floatval, struct sr_datafeed_analog_old *analog, void *info)
Parse a protocol packet.
Analog datafeed payload for type SR_DF_ANALOG_OLD.
The public libsigrok header file to be used by frontends.
uint64_t mqflags
Bitmap with extra information about the MQ.
Mass in troy ounce [oz t].
Mass in pennyweight [dwt].