X-Git-Url: http://git.itanic.dy.fi/?p=log-plotter;a=blobdiff_plain;f=data.c;h=56a6b72faeca6cd445135421bbc5910851c32dd3;hp=31113706da0211dd4079fc45f82c7ff2afa8ae40;hb=HEAD;hpb=3870f4e94d04c2f900ab07100d2f2a4b577c851a diff --git a/data.c b/data.c index 3111370..56a6b72 100644 --- a/data.c +++ b/data.c @@ -18,11 +18,13 @@ #include "event.h" #include "plotter_status.h" +#define MAX_CHANNELS 4 + struct dataparser_struct { struct eventhandler_entry evhandler; - char *log_path; + struct plotter_config *cfg; int infd; - int outfd; + int outfd[MAX_CHANNELS]; int offset; time_t start_time; char buf[256]; @@ -94,6 +96,8 @@ static int parse_logline(const char *buf, struct charger_data *data) i = 0; entries[i]++; /* discard the dollar sign */ data->channel = atoi(entries[i++]); + if (data->channel > MAX_CHANNELS) + data->channel = 0; data->state = atoi(entries[i++]); @@ -119,6 +123,9 @@ static int parse_logline(const char *buf, struct charger_data *data) for (j = 0; j < max_cells; j++, i++) { d = atoi(entries[i]); ASSIGN_OR_NAN(data->cell_voltage[j], d / 1000.0); + + if (d) + data->cell_count++; } d = atoi(entries[i++]); @@ -184,9 +191,11 @@ static void print_status_line(struct charger_data *data) } cell_avg /= (double)active_cells; - pr_info("\r\033[K%8s Ubat: %.3fV Ucell avg: %.3fV " + pr_info("\r\033[K%s [%s] Ubat: %.3fV Ucell avg: %.3fV " "Current: %.2fA Charge %.0fmAh ", - time_str, data->charging_voltage, cell_avg, + time_str, + state_to_str(data->state), + data->charging_voltage, cell_avg, data->charging_current, data->total_charge); fflush(stdout); @@ -249,19 +258,22 @@ static int read_log_line(int infd, char *buf, size_t bufsize, int *offset) return 0; } -static int open_new_logfile(struct dataparser_struct *dt) +static int open_new_logfile(struct dataparser_struct *dt, int channel) { char path[2048]; struct tm *tm; time_t cur_time = time(NULL); tm = localtime(&cur_time); - strftime(path, sizeof(path), dt->log_path, tm); + strftime(path, sizeof(path), dt->cfg->log_path, tm); + + store_int_variable_value_to_array("channel", channel, dt->cfg); + replace_variables_with_values(path, sizeof(path), dt->cfg); pr_debug("Opening %s for writing the log file\n", path); - dt->outfd = open(path, O_CREAT | O_APPEND | O_WRONLY, 0664); - if (dt->outfd < 0) { + dt->outfd[channel] = open(path, O_CREAT | O_APPEND | O_WRONLY, 0664); + if (dt->outfd[channel] < 0) { pr_err("Failed to open file %s for writing: %m\n", path); return -1; @@ -312,11 +324,19 @@ static int read_data(struct eventhandler_entry *h) if (0) dump_data(&data); - if (!dt->log_path) + if (!dt->cfg->log_path) return 0; if (state_has_changed()) { - ret = open_new_logfile(dt); + dt->start_time = time(NULL); + data.timestamp = 0; + store_str_variable_value_to_array("status", + state_to_str(plotter_state.system_status), dt->cfg); + + store_int_variable_value_to_array("cell_count", + data.cell_count, dt->cfg); + + ret = open_new_logfile(dt, data.channel); if (ret < 0) return ret; } @@ -348,7 +368,10 @@ static int read_data(struct eventhandler_entry *h) data.ext_temp, data.total_charge); - ret = write(dt->outfd, str, len); + if (dt->outfd[data.channel] <= 0) + open_new_logfile(dt, data.channel); + + ret = write(dt->outfd[data.channel], str, len); if (ret < 0) { pr_err("write: %m\n"); return -1;; @@ -369,7 +392,7 @@ int init_data_parser(int infd, struct plotter_config *cfg) dataparser.evhandler.fd = infd; dataparser.infd = infd; - dataparser.log_path = cfg->log_path; + dataparser.cfg = cfg; ret = register_event_handler(&dataparser.evhandler); if (ret < 0)