pico-radio/src/recorder/main.c

114 lines
2.7 KiB
C

#include <signal.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libps2000/ps2000.h>
#include <recorder/config.h>
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;
}