X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fscale%2Fkern.c;h=dd18bfc188b0be6395c97d620931693c09ea4a60;hb=d9b716fc5fcd9f9e7e663d5c8fcdbada9cbd94d8;hp=9784c95219b47c34aabe56c0c6b20c9dcddc4399;hpb=e5d953b5592c1ca2af9a0f64f2dfc817a931e59a;p=libsigrok.git
diff --git a/src/scale/kern.c b/src/scale/kern.c
index 9784c952..dd18bfc1 100644
--- a/src/scale/kern.c
+++ b/src/scale/kern.c
@@ -14,14 +14,14 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * along with this program; if not, see .
*/
/*
* KERN scale protocol parser.
*/
+#include
#include
#include
#include
@@ -43,9 +43,9 @@ static int get_buflen(const uint8_t *buf)
}
static int parse_value(const uint8_t *buf, float *result,
- const struct kern_info *info)
+ int *digits, const struct kern_info *info)
{
- char *strval;
+ char *strval, *ptrdot;
float floatval;
int s2, len;
@@ -61,6 +61,9 @@ static int parse_value(const uint8_t *buf, float *result,
strval = g_strndup((const char *)buf, len);
floatval = g_ascii_strtod(strval, NULL);
+ ptrdot = strchr(strval, '.');
+ if (ptrdot)
+ *digits = len - (ptrdot - strval + 1);
g_free(strval);
*result = floatval;
@@ -115,37 +118,37 @@ static void handle_flags(struct sr_datafeed_analog *analog, float *floatval,
(void)floatval;
/* Measured quantity: mass. */
- analog->mq = SR_MQ_MASS;
+ analog->meaning->mq = SR_MQ_MASS;
/* Unit */
if (info->is_gram)
- analog->unit = SR_UNIT_GRAM;
+ analog->meaning->unit = SR_UNIT_GRAM;
if (info->is_carat)
- analog->unit = SR_UNIT_CARAT;
+ analog->meaning->unit = SR_UNIT_CARAT;
if (info->is_ounce)
- analog->unit = SR_UNIT_OUNCE;
+ analog->meaning->unit = SR_UNIT_OUNCE;
if (info->is_pound)
- analog->unit = SR_UNIT_POUND;
+ analog->meaning->unit = SR_UNIT_POUND;
if (info->is_troy_ounce)
- analog->unit = SR_UNIT_TROY_OUNCE;
+ analog->meaning->unit = SR_UNIT_TROY_OUNCE;
if (info->is_pennyweight)
- analog->unit = SR_UNIT_PENNYWEIGHT;
+ analog->meaning->unit = SR_UNIT_PENNYWEIGHT;
if (info->is_grain)
- analog->unit = SR_UNIT_GRAIN;
+ analog->meaning->unit = SR_UNIT_GRAIN;
if (info->is_tael)
- analog->unit = SR_UNIT_TAEL;
+ analog->meaning->unit = SR_UNIT_TAEL;
if (info->is_momme)
- analog->unit = SR_UNIT_MOMME;
+ analog->meaning->unit = SR_UNIT_MOMME;
if (info->is_tola)
- analog->unit = SR_UNIT_TOLA;
+ analog->meaning->unit = SR_UNIT_TOLA;
if (info->is_percentage)
- analog->unit = SR_UNIT_PERCENTAGE;
+ analog->meaning->unit = SR_UNIT_PERCENTAGE;
if (info->is_piece)
- analog->unit = SR_UNIT_PIECE;
+ analog->meaning->unit = SR_UNIT_PIECE;
/* Measurement related flags */
if (info->is_unstable)
- analog->mqflags |= SR_MQFLAG_UNSTABLE;
+ analog->meaning->mqflags |= SR_MQFLAG_UNSTABLE;
}
SR_PRIV gboolean sr_kern_packet_valid(const uint8_t *buf)
@@ -198,18 +201,21 @@ 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 *analog, void *info)
{
- int ret;
+ int ret, digits = 0;
struct kern_info *info_local;
info_local = (struct kern_info *)info;
info_local->buflen = get_buflen(buf);
- if ((ret = parse_value(buf, floatval, info_local)) != SR_OK) {
+ if ((ret = parse_value(buf, floatval, &digits, info_local)) != SR_OK) {
sr_dbg("Error parsing value: %d.", ret);
return ret;
}
+ analog->encoding->digits = digits;
+ analog->spec->spec_digits = digits;
+
parse_flags(buf, info_local);
handle_flags(analog, floatval, info_local);