#include #include #include #include #include #include #include #include bool stop = false; config* cfg; float* buffer; // ctrl+c -> stop void capture_stop(int signal) { (void)signal; stop = true; } void get_overview_buffers(int16_t** overviewBuffers, int16_t overflow, uint32_t triggeredAt, int16_t triggered, int16_t auto_stop, uint32_t nValues) { (void)overflow; (void)triggeredAt; (void)triggered; (void)auto_stop; if (cfg->iq_mode) { for (uint32_t i = 0; i < nValues; i++) { buffer[(i * 2) + 0] = overviewBuffers[0][i] / (float)INT16_MAX; buffer[(i * 2) + 1] = overviewBuffers[2][i] / (float)INT16_MAX; } // fprintf(stderr, "%u\n", nValues); fwrite(buffer, sizeof(float), nValues * 2, stdout); } else { for (uint32_t i = 0; i < nValues; i++) { buffer[i] = overviewBuffers[0][i] / (float)INT16_MAX; } fwrite(buffer, sizeof(float), nValues, stdout); } } void cleanup(int16_t unit) { ps2000_stop(unit); ps2000_close_unit(unit); if (buffer != NULL) { free(buffer); } free(cfg); } int main(int argc, char** argv) { // parse arguments cfg = get_config(argc, argv); // configure picoscope int16_t unit = ps2000_open_unit(); if (unit == -1) { fprintf(stderr, "failed to open a unit!\n"); return -1; } else if (unit == 0) { fprintf(stderr, "no units to open!\n"); return -1; } // configure channels if (ps2000_set_channel(unit, PS2000_CHANNEL_A, true, cfg->dc_mode, cfg->range) == 0) { fprintf(stderr, "set_channel A failed!\n"); cleanup(unit); return -1; } if (cfg->iq_mode) { if (ps2000_set_channel(unit, PS2000_CHANNEL_B, true, cfg->dc_mode, cfg->range) == 0) { fprintf(stderr, "set_channel B failed!\n"); cleanup(unit); return -1; } } // disable interrupts if (ps2000_set_trigger(unit, PS2000_NONE, 0, 0, 0, 0) == 0) { fprintf(stderr, "set_trigger failed!\n"); cleanup(unit); return -1; } // allocate buffer buffer = (float*)malloc(sizeof(float) * (cfg->max_buffersize) * (cfg->iq_mode ? 2 : 1)); // start data capture without aggregation fprintf(stderr, "sample_interval=%u, time_units=%u, buffer_size=%u, max_buffer_size=%u\n", cfg->sample_interval, cfg->time_units, cfg->buffersize, cfg->max_buffersize); if (ps2000_run_streaming_ns(unit, cfg->sample_interval, cfg->time_units, cfg->buffersize, false, 1, cfg->max_buffersize) == 0) { fprintf(stderr, "run_streaming_ns failed!\n"); cleanup(unit); return -1; } // start reading data signal(SIGINT, &capture_stop); while (!stop) { ps2000_get_streaming_last_values(unit, &get_overview_buffers); } cleanup(unit); return 0; }