* 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 <http://www.gnu.org/licenses/>.
*/
/*
* KERN scale protocol parser.
*/
+#include <config.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
}
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;
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;
(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)
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);