X-Git-Url: http://git.itanic.dy.fi/?p=log-plotter;a=blobdiff_plain;f=data.c;h=81a8345743d4552109fd2950161d9a461d090c69;hp=fa370729b0c8a242b4efa053cc569a9dcfa4f632;hb=9abf935040bd368c4b3c1828a79691d200fd45a9;hpb=4daad2abbacb183bc39d7ef1220e86afe6068b5d diff --git a/data.c b/data.c index fa37072..81a8345 100644 --- a/data.c +++ b/data.c @@ -11,8 +11,18 @@ #include "data.h" #include "trace.h" +#include "event.h" #include "utils.h" - +#include "event.h" + +struct dataparser_struct { + struct eventhandler_entry evhandler; + int infd; + int outfd; + int offset; + time_t start_time; + char buf[256]; +}; static int separate_entries(char *buf, char *entries[], int max_entries) { @@ -238,107 +248,102 @@ static int read_log_line(int infd, char *buf, size_t bufsize, int *offset) return 0; } -int read_data(int infd, int outfd) +static int read_data(struct eventhandler_entry *h) { - struct epoll_event ev; - time_t start_time = 0, cur_time; - int epoll_fd; + struct dataparser_struct *dt; + time_t cur_time; int ret; - char buf[256]; - int offset = 0; + struct charger_data data; + char str[320]; + int len; - epoll_fd = epoll_create(1); - if (epoll_fd < 0) { - pr_err("Failed to create epoll socket: %m\n"); - return -1; - } + dt = container_of(h, struct dataparser_struct, evhandler); - ev.events = EPOLLIN; - ev.data.fd = infd; - if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, infd, &ev) == -1) { - pr_err("epoll_ctl: %m\n"); - return 1; - } + ret = read_log_line(dt->infd, dt->buf, sizeof(dt->buf), &dt->offset); + pr_debug("Line now %d: %s\n", dt->offset, dt->buf); + if (ret <= 0) + return ret; - while (1) { - struct charger_data data; - char str[320]; - int len; + if (ret == 0) + pr_err("%s %s: EOF\n", __FILE__, __func__); - ret = epoll_wait(epoll_fd, &ev, 1, -1); - if (ret == 0) - continue; - - if (ret < 0) { - pr_err("epoll: %m\n"); - return -1; - } + if (strlen(dt->buf) < 5) { + pr_debug("discarding truncated log entry\n"); + dt->offset = 0; + return 0; + } - ret = read_log_line(infd, buf, sizeof(buf), &offset); - if (ret < 0) - return ret; + if (!dt->start_time) + dt->start_time = time(NULL); - if (ret == 0) - continue; + cur_time = time(NULL); - if (strlen(buf) < 5) { - pr_debug("discarding truncated log entry\n"); - offset = 0; - continue; - } + parse_logline(dt->buf, &data); - if (!start_time) - start_time = time(NULL); + /* Fill in possibly missing timestamp */ + if (isnan(data.timestamp) || data.timestamp == 0) + data.timestamp = cur_time - dt->start_time; - cur_time = time(NULL); + print_status_line(&data); - parse_logline(buf, &data); + dump_data(&data); - /* Fill in possibly missing timestamp */ - if (isnan(data.timestamp) || data.timestamp == 0); - data.timestamp = cur_time - start_time; + if (!dt->outfd) + return 0; - print_status_line(&data); + len = snprintf(str, sizeof(str), + "%d;%d;%.1f;" + "%.3f;%.3f;%.3f;" + "%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;" + "%.f;%.1f;%.1f\n", /* mAh, and temp */ + data.channel, + data.state, + data.timestamp, - dump_data(&data); + data.input_voltage, + data.charging_voltage, + data.charging_current, - if (!outfd) - continue; + data.cell_voltage[0], + data.cell_voltage[1], + data.cell_voltage[2], + data.cell_voltage[3], + data.cell_voltage[4], + data.cell_voltage[5], + data.cell_voltage[6], + data.cell_voltage[7], + data.cell_voltage[8], + data.cell_voltage[9], + data.int_temp, + data.ext_temp, + data.total_charge); - len = snprintf(str, sizeof(str), - "%d;%d;%.1f;" - "%.3f;%.3f;%.3f;" - "%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;%.3f;" - "%.f;%.1f;%.1f\n", /* mAh, and temp */ - data.channel, - data.state, - data.timestamp, - - data.input_voltage, - data.charging_voltage, - data.charging_current, - - data.cell_voltage[0], - data.cell_voltage[1], - data.cell_voltage[2], - data.cell_voltage[3], - data.cell_voltage[4], - data.cell_voltage[5], - data.cell_voltage[6], - data.cell_voltage[7], - data.cell_voltage[8], - data.cell_voltage[9], - data.int_temp, - data.ext_temp, - data.total_charge); - - ret = write(outfd, str, len); - if (ret < 0) { - pr_err("write: %m\n"); - break; - } + ret = write(dt->outfd, str, len); + if (ret < 0) { + pr_err("write: %m\n"); + return -1;; } return 0; } +static struct dataparser_struct dataparser = { + .evhandler.name = "OpenLog Parser", + .evhandler.events = EPOLLIN, + .evhandler.handle_event = read_data, +}; + +int init_data_parser(int infd, int outfd) +{ + int ret; + + dataparser.evhandler.fd = infd; + dataparser.infd = infd; + dataparser.outfd = outfd; + + ret = register_event_handler(&dataparser.evhandler); + if (ret < 0) + return 1; + + return 0; +}