int ssd_reverse(Quark *q) { ss_data *ssd = ssd_get_data(q); int nrows, ncols, i, j, k; if (!ssd) { return RETURN_FAILURE; } nrows = ssd_get_nrows(q); ncols = ssd_get_ncols(q); for (k = 0; k < ncols; k++) { ss_column *col = &ssd->cols[k]; if (col->format == FFORMAT_STRING) { char **s = col->data; for (i = 0; i < nrows/2; i++) { j = (nrows - 1) - i; sswap(&s[i], &s[j]); } } else { double *x = col->data; for (i = 0; i < nrows/2; i++) { j = (nrows - 1) - i; fswap(&x[i], &x[j]); } } } quark_dirtystate_set(q, TRUE); return RETURN_SUCCESS; }
bool PvrSSD::poll() { #ifdef HAVE_SSD if (!connection) return false; if (!ssd_report_exists()) return false; SSDreport e; ssd_get_report(&e); for (int i = 0; i < e.nvalues; i++) { SSDdata d; ssd_get_data(&d); int j = -1; for (j = 0; j < ssdData.size(); j++) { if (ssdData[j].idx == d.idx) { memcpy(&ssdData[j], &d, sizeof(d)); break; } } if (j < 0 || j >= ssdData.size()) { ssdData.push_back(d); //memcpy(&ssdData[ssdData.size()-1], &d, sizeof(d)); } #ifdef VERBOSE fprintf(stderr, "i = %d, device = %d, idx = %d\n", i, ssdData[i].device, ssdData[i].idx); #endif #if 0 if (ssdData[i].device == SSD_SENSOR) { for (int ii = 0; ii < 4; ii++) { for (int jj = 0; jj < 4; jj++) fprintf (stderr, "%.1f ", ssdData[i].val.sdata[ii][jj]); fprintf (stderr, "\n"); } } fprintf (stderr, "-----------------------\n"); #endif } //ssd_ack (e.timestamp); return true; #else return false; #endif }
/* * Coalesce two SSDs. fromq will be deleted, preceded by transferring of all * its children to toq */ int ssd_coalesce(Quark *toq, Quark *fromq) { unsigned int nrows, ncols, i, j; ss_data *ssd; AMem *amem = toq->amem; coalesce_hook_t p; nrows = ssd_get_nrows(fromq); if (nrows > ssd_get_nrows(toq)) { if (ssd_set_nrows(toq, nrows) != RETURN_SUCCESS) { return RETURN_FAILURE; } } /* original number of columns */ ncols = ssd_get_ncols(toq); ssd = ssd_get_data(fromq); for (i = 0; i < ssd->ncols; i++) { ss_column *col = &ssd->cols[i]; ss_column *col_new = ssd_add_col(toq, col->format); if (!col_new) { return RETURN_FAILURE; } col_new->label = amem_strdup(amem, col->label); if (col->format == FFORMAT_STRING) { for (j = 0; j < nrows; j++) { ((char **) col_new->data)[j] = amem_strdup(amem, ((char **) col->data)[j]); } } else { memcpy(col_new->data, col->data, nrows*SIZEOF_DOUBLE); } } p.toq = toq; p.nshift = ncols; quark_traverse(fromq, coalesce_hook, &p); quark_free(fromq); return RETURN_SUCCESS; }
/* * drop rows */ int ssd_delete_rows(Quark *q, unsigned int startno, unsigned int endno) { ss_data *ssd = ssd_get_data(q); unsigned int i, j, dist; if (!ssd || startno >= ssd->nrows || endno >= ssd->nrows) { return RETURN_FAILURE; } if (endno < startno) { uswap(&endno, &startno); } if (endno == ssd->nrows - 1) { /* trivial case */ return ssd_set_nrows(q, startno); } dist = endno - startno + 1; for (j = 0; j < ssd->ncols; j++) { ss_column *col = &ssd->cols[j]; if (col->format == FFORMAT_STRING) { char **s = col->data; for (i = startno; i <= endno; i++) { amem_free(q->amem, s[i]); } memmove(s + startno, s + endno + 1, (ssd->nrows - endno - 1)*SIZEOF_VOID_P); } else { double *x = col->data; memmove(x + startno, x + endno + 1, (ssd->nrows - endno - 1)*SIZEOF_DOUBLE); } } ssd->nrows -= dist; quark_dirtystate_set(q, TRUE); return RETURN_SUCCESS; }