SR_PRIV int teleinfo_receive_data(int fd, int revents, void *cb_data) { struct sr_dev_inst *sdi; struct dev_context *devc; struct sr_serial_dev_inst *serial; const uint8_t *ptr, *next_ptr, *end_ptr; int len; int64_t time; (void)fd; if (!(sdi = cb_data) || !(devc = sdi->priv) || revents != G_IO_IN) return TRUE; serial = sdi->conn; /* Try to get as much data as the buffer can hold. */ len = TELEINFO_BUF_SIZE - devc->buf_len; len = serial_read(serial, devc->buf + devc->buf_len, len); if (len < 1) { sr_err("Serial port read error: %d.", len); return FALSE; } devc->buf_len += len; /* Now look for packets in that data. */ ptr = devc->buf; end_ptr = ptr + devc->buf_len; while ((next_ptr = teleinfo_parse_data(sdi, ptr, end_ptr - ptr, NULL))) ptr = next_ptr; /* If we have any data left, move it to the beginning of our buffer. */ memmove(devc->buf, ptr, end_ptr - ptr); devc->buf_len -= ptr - devc->buf; /* If buffer is full and no valid packet was found, wipe buffer. */ if (devc->buf_len >= TELEINFO_BUF_SIZE) { devc->buf_len = 0; return FALSE; } if (devc->limit_samples && devc->num_samples >= devc->limit_samples) { sr_info("Requested number of samples reached."); sdi->driver->dev_acquisition_stop(sdi, devc->session_cb_data); return TRUE; } if (devc->limit_msec) { time = (g_get_monotonic_time() - devc->start_time) / 1000; if (time > (int64_t)devc->limit_msec) { sr_info("Requested time limit reached."); sdi->driver->dev_acquisition_stop(sdi, devc->session_cb_data); return TRUE; } } return TRUE; }
SR_PRIV int teleinfo_get_optarif(const uint8_t *buf) { const uint8_t *ptr = buf; char optarif[5] = { 0 }; while ((ptr = teleinfo_parse_data(NULL, ptr, 292-(ptr-buf), optarif))); if (!strcmp(optarif, "BASE")) return OPTARIF_BASE; else if (!strcmp(optarif, "HC..")) return OPTARIF_HC; else if (!strcmp(optarif, "EJP.")) return OPTARIF_EJP; else if (!strncmp(optarif, "BBR", 3)) return OPTARIF_BBR; return OPTARIF_NONE; }
SR_PRIV int teleinfo_receive_data(int fd, int revents, void *cb_data) { struct sr_dev_inst *sdi; struct dev_context *devc; struct sr_serial_dev_inst *serial; const uint8_t *ptr, *next_ptr, *end_ptr; int len; (void)fd; if (!(sdi = cb_data) || !(devc = sdi->priv) || revents != G_IO_IN) return TRUE; serial = sdi->conn; /* Try to get as much data as the buffer can hold. */ len = TELEINFO_BUF_SIZE - devc->buf_len; len = serial_read_nonblocking(serial, devc->buf + devc->buf_len, len); if (len < 1) { sr_err("Serial port read error: %d.", len); return FALSE; } devc->buf_len += len; /* Now look for packets in that data. */ ptr = devc->buf; end_ptr = ptr + devc->buf_len; while ((next_ptr = teleinfo_parse_data(sdi, ptr, end_ptr - ptr, NULL))) ptr = next_ptr; /* If we have any data left, move it to the beginning of our buffer. */ memmove(devc->buf, ptr, end_ptr - ptr); devc->buf_len -= ptr - devc->buf; /* If buffer is full and no valid packet was found, wipe buffer. */ if (devc->buf_len >= TELEINFO_BUF_SIZE) { devc->buf_len = 0; return FALSE; } if (sr_sw_limits_check(&devc->sw_limits)) sdi->driver->dev_acquisition_stop(sdi); return TRUE; }