#include "debug.h"
#include "string.h"
+int parse_opts(const char *str, char *ow_path, size_t pathlen, double *offset)
+{
+ char *endptr;
+ const char *start_str = str;
+ const char offset_str[] = "offset=";
+
+ if (!offset)
+ return 0;
+
+ /*
+ * Skip the onewire path entry. Options begin after the first
+ * white space
+ */
+ for (; *str; str++)
+ if (isspace(*str))
+ break;
+
+ /* Copy the onewire path without options */
+ strncpy(ow_path, start_str, pathlen);
+ ow_path[str - start_str] = '\0';
+
+ /* Get the next non-space, which is where the argument begins */
+ for (; *str; str++)
+ if (!isspace(*str))
+ break;
+
+ if (strncmp(str, offset_str, sizeof(offset_str) - 1))
+ return 0;
+ str += sizeof(offset_str) - 1;
+
+ *offset = strtod(str, &endptr);
+
+ if (str != endptr)
+ return 1;
+
+ return 0;
+}
+
int onewire_parser(char *rrd_data, const char **parser_data)
{
OWNET_HANDLE h;
}
while (parser_data[i]) {
+ double offset = 0, data;
+ char *endptr;
+ char ow_path[1024];
+
if (!strcmp("U", parser_data[i])) {
undefined:
ret = snprintf(rrd_data, max_str, "U");
goto next;
}
- pr_info("Reading data for entry %s\n", parser_data[i]);
- ret = OWNET_read(h, parser_data[i], &tmp);
+ parse_opts(parser_data[i], ow_path, sizeof(ow_path), &offset);
+
+ pr_info("Reading data for entry %s with offset of %.2f\n",
+ ow_path, offset);
+ ret = OWNET_read(h, ow_path, &tmp);
if (ret < 0) {
pr_err("Failed to read entry %s\n", parser_data[i]);
goto undefined;
free(tmp);
buf[ret] = 0;
- ret = snprintf(rrd_data, max_str, "%s", buf);
+ data = strtod(buf, &endptr);
+
+ if (endptr == buf) {
+ pr_err("Failed to parse data %s\n", buf);
+ goto undefined;
+ }
+
+ data += offset;
+
+ ret = snprintf(rrd_data, max_str, "%f", data);
max_str -= ret;
rrd_data += ret;