|
@@ -27,9 +27,18 @@ private:
|
|
|
int32_t points_value = 0;
|
|
|
uint32_t sample_rate = 0;
|
|
|
std::vector<uint32_t> times;
|
|
|
+<<<<<<< HEAD
|
|
|
+ uint32_t num_triggers = 0;
|
|
|
uint32_t number_channels = 0;
|
|
|
std::vector<PS4000A_CHANNEL> channels;
|
|
|
std::vector<uint32_t> points_vector;
|
|
|
+ uint32_t points_simple = 0;
|
|
|
+ uint32_t premeasurement_percentage = 0;
|
|
|
+=======
|
|
|
+ uint32_t number_channels = 0;
|
|
|
+ std::vector<PS4000A_CHANNEL> channels;
|
|
|
+ std::vector<uint32_t> points_vector;
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
PS4000A_CONDITION* conditions;
|
|
|
PS4000A_CHANNEL trig_channel = PS4000A_CHANNEL_A;
|
|
|
PS4000A_THRESHOLD_DIRECTION th_direction = PS4000A_ABOVE;
|
|
@@ -38,6 +47,10 @@ private:
|
|
|
int16_t trig_autoTrigger_ms = 0;
|
|
|
uint32_t nbytes_sent = 0;
|
|
|
std::vector<std::vector<int16_t*>> data_buffer_vec;
|
|
|
+<<<<<<< HEAD
|
|
|
+ std::vector<int16_t*> simple_data_buffer;
|
|
|
+=======
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
|
|
|
uint8_t rcbuf[MAX_PACKET]{0};
|
|
|
uint8_t sndbuf[MAX_PACKET]{0};
|
|
@@ -318,7 +331,11 @@ public:
|
|
|
{
|
|
|
this->last_command = 0x09;
|
|
|
logger << LogPref::Flag(INFO) << "Command 0x09 received" << endl;
|
|
|
+<<<<<<< HEAD
|
|
|
+ if(bytes_recieved < 16) {
|
|
|
+=======
|
|
|
if(bytes_recieved < 15) {
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
|
|
|
sndbuf[0] = magic_number;
|
|
|
sndbuf[1] = 0xFF;
|
|
@@ -332,6 +349,32 @@ public:
|
|
|
}
|
|
|
uint32_t channels = 0;
|
|
|
memcpy(&channels, rcbuf + 2, sizeof(uint32_t));
|
|
|
+<<<<<<< HEAD
|
|
|
+ if(channels < 1 || channels > 16) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Invalid number of channels" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x02;
|
|
|
+ this->error_code = 0x00000000;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ enPicoConnectProbeRange* channels_range = new enPicoConnectProbeRange[channels];
|
|
|
+ memset(channels_range, PICO_X1_PROBE_5V, sizeof(uint8_t) * channels);
|
|
|
+ memcpy(channels_range, rcbuf + 6, sizeof(uint8_t) * channels);
|
|
|
+ uint8_t trigger_channel = 0;
|
|
|
+ memcpy(&trigger_channel, rcbuf + 6 + channels, sizeof(uint8_t));
|
|
|
+ int32_t direction = 0;
|
|
|
+ memcpy(&direction, rcbuf + 7 + channels, sizeof(int32_t));
|
|
|
+ uint16_t threshold = 0;
|
|
|
+ memcpy(&threshold, rcbuf + 11 + channels, sizeof(uint16_t));
|
|
|
+ int16_t autoTrigger_ms = 0;
|
|
|
+ memcpy(&autoTrigger_ms, rcbuf + 13, sizeof(int16_t));
|
|
|
+ pico_configure_channels(channels, channels_range, trigger_channel, direction, threshold, autoTrigger_ms);
|
|
|
+=======
|
|
|
uint8_t trigger_channel = 0;
|
|
|
memcpy(&trigger_channel, rcbuf + 6, sizeof(uint8_t));
|
|
|
int32_t direction = 0;
|
|
@@ -341,6 +384,7 @@ public:
|
|
|
int16_t autoTrigger_ms = 0;
|
|
|
memcpy(&autoTrigger_ms, rcbuf + 13, sizeof(int16_t));
|
|
|
pico_configure_channels(channels, trigger_channel, direction, threshold, autoTrigger_ms);
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(INFO) << "Pico device channels configured" << endl;
|
|
|
break;
|
|
|
}
|
|
@@ -348,7 +392,11 @@ public:
|
|
|
{
|
|
|
this->last_command = 0x0A;
|
|
|
logger << LogPref::Flag(INFO) << "Command 0x0A received" << endl;
|
|
|
+<<<<<<< HEAD
|
|
|
+ pico_begin_measurement_times();
|
|
|
+=======
|
|
|
pico_begin_measurement();
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(INFO) << "Pico device measurement started" << endl;
|
|
|
break;
|
|
|
}
|
|
@@ -373,6 +421,127 @@ public:
|
|
|
logger << LogPref::Flag(INFO) << "Pico device stopped" << endl;
|
|
|
break;
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
+ case 0x20:
|
|
|
+ {
|
|
|
+ this->last_command = 0x20;
|
|
|
+ logger << LogPref::Flag(INFO) << "Command 0x0F received" << endl;
|
|
|
+ if(bytes_recieved < 12) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x01;
|
|
|
+ this->error_code = 0x00000000;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ uint32_t trigger_channel = 0;
|
|
|
+ memcpy(&trigger_channel, rcbuf + 2, sizeof(uint32_t));
|
|
|
+ int32_t direction = 0;
|
|
|
+ memcpy(&direction, rcbuf + 6, sizeof(int32_t));
|
|
|
+ uint16_t threshold = 0;
|
|
|
+ memcpy(&threshold, rcbuf + 10, sizeof(uint16_t));
|
|
|
+ int16_t autoTrigger_ms = 0;
|
|
|
+ memcpy(&autoTrigger_ms, rcbuf + 12, sizeof(int16_t));
|
|
|
+
|
|
|
+ pico_configure_trigger(trigger_channel, direction, threshold, autoTrigger_ms);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x28:
|
|
|
+ {
|
|
|
+ this->last_command = 0x28;
|
|
|
+ logger << LogPref::Flag(INFO) << "Command 0x28 received" << endl;
|
|
|
+ if(bytes_recieved < 6) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x01;
|
|
|
+ this->error_code = 0x00000000;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ uint32_t percentage = 0;
|
|
|
+ memcpy(&percentage, rcbuf + 2, sizeof(uint32_t));
|
|
|
+ if(percentage < 0 || percentage > 100) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Invalid premeasurement percentage" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x02;
|
|
|
+ this->error_code = 0x00000000;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ pico_set_premeasurement(percentage);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x2B:
|
|
|
+ {
|
|
|
+ this->last_command = 0x2B;
|
|
|
+ logger << LogPref::Flag(INFO) << "Command 0x2B received" << endl;
|
|
|
+ pico_simple_measure();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x17:
|
|
|
+ {
|
|
|
+ this->last_command = 0x17;
|
|
|
+ logger << LogPref::Flag(INFO) << "Command 0x17 received" << endl;
|
|
|
+ if(bytes_recieved < 6) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x01;
|
|
|
+ this->error_code = 0x00000000;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ uint32_t points = 0;
|
|
|
+ memcpy(&points, rcbuf + 2, sizeof(uint32_t));
|
|
|
+ pico_set_simple_points(points);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x19:
|
|
|
+ {
|
|
|
+ this->last_command = 0x19;
|
|
|
+ logger << LogPref::Flag(INFO) << "Command 0x19 received" << endl;
|
|
|
+ if(bytes_recieved < 6) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x01;
|
|
|
+ this->error_code = 0x00000000;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ uint32_t num_trigger = 0;
|
|
|
+ memcpy(&num_trigger, rcbuf + 2, sizeof(uint32_t));
|
|
|
+ pico_set_num_trigger(num_trigger);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x1B:
|
|
|
+ {
|
|
|
+ this->last_command = 0x1B;
|
|
|
+ logger << LogPref::Flag(INFO) << "Command 0x1B received" << endl;
|
|
|
+ pico_multitrigger_measure();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+=======
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
default:
|
|
|
{
|
|
|
this->last_command = 0xFF;
|
|
@@ -470,6 +639,10 @@ public:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+ // To be deprecated in future versions
|
|
|
+=======
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
int pico_xml_config(const string& file_name) {
|
|
|
// Load configuration from XML file
|
|
|
auto data_set = parse_xml_function(file_name.c_str());
|
|
@@ -491,6 +664,10 @@ public:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+ // Deprecated function, use other functions instead
|
|
|
+=======
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
int pico_set_params(const uint32_t* points, const uint32_t* times, const uint32_t sample_rate, const uint32_t number_channels, const uint32_t size) {
|
|
|
// Set parameters for measurement
|
|
|
this->points_vector.assign(points, points + size);
|
|
@@ -552,6 +729,13 @@ public:
|
|
|
|
|
|
sndbuf[0] = magic_number;
|
|
|
sndbuf[1] = 0xC4;
|
|
|
+<<<<<<< HEAD
|
|
|
+
|
|
|
+ memcpy(sndbuf + 2, points_vector.data(), sizeof(points_vector.data()));
|
|
|
+ memcpy(sndbuf + 2 + sizeof(points_vector.data()), times.data(), sizeof(times.data()));
|
|
|
+ memcpy(sndbuf + 2 + sizeof(points_vector.data()) + sizeof(times.data()), &sample_rate, sizeof(sample_rate));
|
|
|
+ memcpy(sndbuf + 6 + sizeof(points_vector.data()) + sizeof(times.data()), &number_channels, sizeof(number_channels));
|
|
|
+=======
|
|
|
uint32_t bsize = points_vector.size() * sizeof(uint32_t);
|
|
|
uint32_t test = 0;
|
|
|
|
|
@@ -563,6 +747,7 @@ public:
|
|
|
logger << LogPref::Flag(INFO) << times.data()[0] << endl;
|
|
|
memcpy(sndbuf + 6 + 2 * bsize, &sample_rate, sizeof(sample_rate));
|
|
|
memcpy(sndbuf + 10 + 2 * bsize, &number_channels, sizeof(number_channels));
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
|
|
|
if(SocketActive->Send(sndbuf, 10 + sizeof(points_vector.data()) + sizeof(times.data())) == -1) {
|
|
|
logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
@@ -604,6 +789,25 @@ public:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+ int pico_set_simple_points(const uint32_t points) {
|
|
|
+ // Set simple points for measurement
|
|
|
+ this->points_simple = points;
|
|
|
+ logger << LogPref::Flag(INFO) << "Simple points set to: " << points << endl;
|
|
|
+
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xD7;
|
|
|
+
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+=======
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
int pico_set_sample_rate(const uint32_t sample_rate) {
|
|
|
// Set sample rate for measurement
|
|
|
this->sample_rate = sample_rate;
|
|
@@ -636,7 +840,26 @@ public:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+ int pico_set_num_trigger(const uint32_t num_trigger) {
|
|
|
+ // Set number of channels for trigger
|
|
|
+ this->num_triggers = num_trigger;
|
|
|
+ logger << LogPref::Flag(INFO) << "Number of triggers set to: " << num_trigger << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xD9;
|
|
|
+ memcpy(sndbuf + 2, &num_triggers, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 6) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int pico_configure_channels(const uint32_t number_channels, enPicoConnectProbeRange* channel_ranges, uint8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
|
|
|
+=======
|
|
|
int pico_configure_channels(const uint32_t number_channels, uint8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
// Set number of channels for measurement
|
|
|
this->number_channels = number_channels;
|
|
|
logger << LogPref::Flag(INFO) << "Number of channels set to: " << number_channels << endl;
|
|
@@ -648,7 +871,11 @@ public:
|
|
|
conditions[i].condition = PS4000A_CONDITION_FALSE;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+ if(auto retval = ps4000aSetChannel(handle, channels[trigger_channel], true, PS4000A_DC, channel_ranges[trigger_channel], 0) != 0) {
|
|
|
+=======
|
|
|
if(auto retval = ps4000aSetChannel(handle, channels[trigger_channel], true, PS4000A_DC, PICO_X1_PROBE_5V, 0) != 0) {
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(ERROR) << "Failed to set trigger channel. Code: " << retval << endl;
|
|
|
sndbuf[0] = magic_number;
|
|
|
sndbuf[1] = 0xFF;
|
|
@@ -671,7 +898,11 @@ public:
|
|
|
for(uint8_t i = 0; i < number_channels; ++i) {
|
|
|
if(i == trigger_channel) continue;
|
|
|
else {
|
|
|
+<<<<<<< HEAD
|
|
|
+ auto retval = ps4000aSetChannel(handle, channels[i], true, PS4000A_AC, channel_ranges[i], 0);
|
|
|
+=======
|
|
|
auto retval = ps4000aSetChannel(handle, channels[i], true, PS4000A_AC, PICO_X1_PROBE_5V, 0);
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
if (retval != 0) {
|
|
|
logger << LogPref::Flag(ERROR) << "Failed to set channel " << i << ". Code: " << retval << endl;
|
|
|
sndbuf[0] = magic_number;
|
|
@@ -723,7 +954,12 @@ public:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+ // To be deprecated in future versions
|
|
|
+ int pico_begin_measurement_times() {
|
|
|
+=======
|
|
|
int pico_begin_measurement() {
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
// Begin measurement on Pico device
|
|
|
|
|
|
data_buffer_vec.assign(times.size(), std::vector<int16_t*>(number_channels, nullptr));
|
|
@@ -856,11 +1092,23 @@ public:
|
|
|
std::string filename = "data" + std::to_string(i) + ".csv";
|
|
|
writing_data_fixed_name(filename, data_buffer_vec[i], points_vector[i], number_channels);
|
|
|
logger << LogPref::Flag(INFO) << "Data collection done" << endl;
|
|
|
+<<<<<<< HEAD
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Free buffers" << endl;
|
|
|
+ for(uint8_t j = 0; j < times.size(); ++j)
|
|
|
+ {
|
|
|
+ free_buffers(data_buffer_vec[j]);
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
|
|
|
+
|
|
|
+=======
|
|
|
logger << LogPref::Flag(INFO) << "Free buffers? Why?" << endl;
|
|
|
free_buffers(data_buffer_vec[i]);
|
|
|
logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
|
|
|
}
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(INFO) << "Measurement done" << endl;
|
|
|
sndbuf[0] = magic_number;
|
|
|
sndbuf[1] = 0xCB;
|
|
@@ -869,14 +1117,21 @@ public:
|
|
|
logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
return -1;
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
+=======
|
|
|
|
|
|
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
+
|
|
|
+=======
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
int pico_exit() {
|
|
|
// Exit Pico device and free resources
|
|
|
if (handle != NULL) {
|
|
@@ -907,12 +1162,386 @@ public:
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
+
|
|
|
+ int pico_configure_trigger(int8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
|
|
|
+ // Configure trigger for Pico device
|
|
|
+ this->trig_channel = channels[trigger_channel];
|
|
|
+ this->th_direction = static_cast<PS4000A_THRESHOLD_DIRECTION>(direction);
|
|
|
+ this->trig_delay = 10;
|
|
|
+ this->threshold = threshold;
|
|
|
+ this->trig_autoTrigger_ms = autoTrigger_ms;
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Trigger configured" << endl;
|
|
|
+
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xC9;
|
|
|
+
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ auto retval = ps4000aSetSimpleTrigger
|
|
|
+ (
|
|
|
+ handle,
|
|
|
+ true,
|
|
|
+ channels[trigger_channel],
|
|
|
+ this->threshold,
|
|
|
+ this->th_direction,
|
|
|
+ this->trig_delay,
|
|
|
+ this->trig_autoTrigger_ms
|
|
|
+ );
|
|
|
+
|
|
|
+ if (retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x16;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;\
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xE0;
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int pico_simple_measure()
|
|
|
+ {
|
|
|
+ simple_data_buffer = std::vector<int16_t*>(number_channels, nullptr);
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Set simple data buffer:" << endl;
|
|
|
+ for(size_t j = 0; j < number_channels; ++j) {
|
|
|
+ simple_data_buffer[j] = new int16_t[points_simple];
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Get timebase:" << endl;\
|
|
|
+ uint32_t timebase = timebase_choice(sample_rate);
|
|
|
+ logger << "Timebase = " << timebase << endl;
|
|
|
+ int32_t timeIntervalNanoseconds = 0;
|
|
|
+ int32_t maxSamples = 0;
|
|
|
+ int32_t segmentIndex = 0;
|
|
|
+
|
|
|
+ int32_t retval = ps4000aGetTimebase(handle, timebase, points_simple, &timeIntervalNanoseconds,
|
|
|
+ &maxSamples, segmentIndex);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x17;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Run block:" << endl;
|
|
|
+ int32_t noOfPreTriggerSamples = (int32_t) (points_simple * premeasurement_percentage / 100.0f);
|
|
|
+ int32_t noOfPostTriggerSamples = points_simple;
|
|
|
+ retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
|
|
|
+ nullptr, segmentIndex, nullptr, nullptr);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x18;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Run block done" << endl;
|
|
|
+
|
|
|
+ int16_t ready = 0;
|
|
|
+ while (ready == 0) {
|
|
|
+ retval = ps4000aIsReady(handle, &ready);
|
|
|
+ }
|
|
|
+
|
|
|
+ for(uint8_t j = 0; j < number_channels; ++j) {
|
|
|
+ logger << LogPref::Flag(INFO) << "Set simple data buffer for channel " << j << endl;
|
|
|
+ PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
|
|
|
+ retval = ps4000aSetDataBuffer(handle, channels[j], simple_data_buffer[j], points_simple,
|
|
|
+ segmentIndex, mode);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x19 + j;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Set simple data buffer done" << endl;
|
|
|
+ logger << LogPref::Flag(INFO) << "Data collection start" << endl;
|
|
|
+ uint32_t StartIndex = 0;
|
|
|
+ uint32_t noOfSamples = static_cast<uint32_t>(points_simple);
|
|
|
+ int16_t overflow = 0;
|
|
|
+ uint32_t DownSampleRatio = 1;
|
|
|
+ retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
|
|
|
+ segmentIndex, &overflow);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x20;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Data collection done" << endl;
|
|
|
+
|
|
|
+ std::string filename = "simple_data_channel.csv";
|
|
|
+ writing_data_fixed_name(filename, simple_data_buffer, points_simple, 1);
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Free simple data buffers" << endl;
|
|
|
+ for(uint8_t j = 0; j < number_channels; ++j)
|
|
|
+ {
|
|
|
+ delete[] simple_data_buffer[j];
|
|
|
+ simple_data_buffer[j] = nullptr;
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Simple data buffers freed" << endl;
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Simple measurement done" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xEB;
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int pico_set_premeasurement(uint32_t percentage)
|
|
|
+ {
|
|
|
+ // Set pre-measurement percentage
|
|
|
+ this->premeasurement_percentage = percentage;
|
|
|
+ logger << LogPref::Flag(INFO) << "Pre-measurement percentage set to: " << percentage << "%" << endl;
|
|
|
+
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xE8;
|
|
|
+
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int pico_multitrigger_measure()
|
|
|
+ {
|
|
|
+ // Multi-trigger measurement
|
|
|
+ logger << LogPref::Flag(INFO) << "Multi-trigger measurement started" << endl;
|
|
|
+
|
|
|
+ data_buffer_vec = std::vector<std::vector<int16_t*>>(num_triggers, std::vector<int16_t*>(number_channels, nullptr));
|
|
|
+ for(size_t i = 0; i < num_triggers; ++i) {
|
|
|
+ data_buffer_vec[i].assign(number_channels, nullptr);
|
|
|
+ for(size_t j = 0; j < number_channels; ++j) {
|
|
|
+ data_buffer_vec[i][j] = new int16_t[points_value];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for(size_t i = 0; i < num_triggers; ++i) {
|
|
|
+ logger << LogPref::Flag(INFO) << "Set data buffer for trigger " << i << ":" << endl;
|
|
|
+ for(size_t j = 0; j < number_channels; ++j) {
|
|
|
+ data_buffer_vec[i][j] = new int16_t[points_value];
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Get timebase:" << endl;
|
|
|
+ uint32_t timebase = timebase_choice(sample_rate);
|
|
|
+ logger << "Timebase = " << timebase << endl;
|
|
|
+
|
|
|
+ int32_t timeIntervalNanoseconds = 0;
|
|
|
+ int32_t maxSamples = 0;
|
|
|
+ int32_t segmentIndex = 0;
|
|
|
+
|
|
|
+ int32_t retval = ps4000aGetTimebase(handle, timebase, points_value, &timeIntervalNanoseconds,
|
|
|
+ &maxSamples, segmentIndex);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x22;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Run block:" << endl;
|
|
|
+
|
|
|
+ int32_t noOfPreTriggerSamples = 0;
|
|
|
+ int32_t noOfPostTriggerSamples = points_value;
|
|
|
+
|
|
|
+ retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
|
|
|
+ nullptr, segmentIndex, nullptr, nullptr);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x23;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Run block done" << endl;
|
|
|
+ int16_t ready = 0;
|
|
|
+ while (ready == 0) {
|
|
|
+ retval = ps4000aIsReady(handle, &ready);
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Set data buffer for channels:" << endl;
|
|
|
+ for(uint8_t j = 0; j < number_channels; ++j) {
|
|
|
+ PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
|
|
|
+ retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_value,
|
|
|
+ segmentIndex, mode);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x24 + j;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
|
|
|
+ logger << LogPref::Flag(INFO) << "Data collection start" << endl;
|
|
|
+ uint32_t StartIndex = 0;
|
|
|
+ uint32_t noOfSamples = static_cast<uint32_t>(points_value);
|
|
|
+ int16_t overflow = 0;
|
|
|
+ uint32_t DownSampleRatio = 1;
|
|
|
+ retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
|
|
|
+ segmentIndex, &overflow);
|
|
|
+ logger << "retval: " << retval << endl;
|
|
|
+ if(retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x25;
|
|
|
+ this->error_code = retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Data collection done" << endl;
|
|
|
+ logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xDA;
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
|
|
|
+ logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
|
|
|
+
|
|
|
+ auto trig_retval = ps4000aSetSimpleTrigger
|
|
|
+ (
|
|
|
+ handle,
|
|
|
+ true,
|
|
|
+ channels[this->trig_channel],
|
|
|
+ threshold,
|
|
|
+ th_direction,
|
|
|
+ trig_delay,
|
|
|
+ trig_autoTrigger_ms
|
|
|
+ );
|
|
|
+
|
|
|
+ if (trig_retval != 0) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << trig_retval << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xFF;
|
|
|
+ sndbuf[2] = 0x26;
|
|
|
+ this->error_code = trig_retval;
|
|
|
+ memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
|
|
|
+ if(SocketActive->Send(sndbuf, 7) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger << LogPref::Flag(INFO) << "Writing data to files" << endl;
|
|
|
+ for(int i = 0; i < data_buffer_vec.size(); ++i) {
|
|
|
+ logger << LogPref::Flag(INFO) << "Writing data " << i << " to file" << endl;
|
|
|
+ std::string filename = "data_trigger_" + std::to_string(i) + ".csv";
|
|
|
+ writing_data_fixed_name(filename, data_buffer_vec[i], points_value, number_channels);
|
|
|
+ logger << LogPref::Flag(INFO) << "Data collection done" << endl;
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Free buffers" << endl;
|
|
|
+ for(uint8_t j = 0; j < num_triggers; ++j)
|
|
|
+ {
|
|
|
+ free_buffers(data_buffer_vec[j]);
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
|
|
|
+ logger << LogPref::Flag(INFO) << "Multi-trigger measurement done" << endl;
|
|
|
+ sndbuf[0] = magic_number;
|
|
|
+ sndbuf[1] = 0xDB;
|
|
|
+ if(SocketActive->Send(sndbuf, 2) == -1) {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+=======
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
};
|
|
|
|
|
|
int main()
|
|
|
{
|
|
|
+<<<<<<< HEAD
|
|
|
+=======
|
|
|
logger.enableConsoleOutput(true);
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << "Open socket" << endl;
|
|
|
CPassiveSocket SocketPassive(CSimpleSocket::CSocketType::SocketTypeTcp);
|
|
|
if (!SocketPassive.Initialize())
|
|
@@ -920,19 +1549,34 @@ int main()
|
|
|
logger << LogPref::Flag(ERROR) << "Socket initialization failed" << endl;
|
|
|
return -1;
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
+ if(!SocketPassive.Listen("localhost", 5002))
|
|
|
+=======
|
|
|
if(!SocketPassive.Listen("127.0.0.1", 5003))
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
{
|
|
|
logger << LogPref::Flag(ERROR) << "Socket listening failed" << endl;
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
+=======
|
|
|
logger << "Socket initialized!" << endl;
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
CActiveSocket* ClientSocket;
|
|
|
PicoLocalService* pico_service;
|
|
|
|
|
|
while(true)
|
|
|
{
|
|
|
+<<<<<<< HEAD
|
|
|
+ if ((ClientSocket = SocketPassive.Accept()) != nullptr)
|
|
|
+ {
|
|
|
+ logger << LogPref::Flag(ERROR) << "Socket accept failed" << endl;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+=======
|
|
|
logger << LogPref::Flag(INFO) << "Wait for connection..." << endl;
|
|
|
logger.closeLogger();
|
|
|
|
|
@@ -949,6 +1593,7 @@ int main()
|
|
|
logger.initializeLogger("picologs", "pico");
|
|
|
logger.enableConsoleOutput(true);
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|
|
|
logger << LogPref::Flag(INFO) << "Client connected" << endl;
|
|
|
pico_service = new PicoLocalService(ClientSocket);
|
|
|
|
|
@@ -967,5 +1612,8 @@ int main()
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+<<<<<<< HEAD
|
|
|
+=======
|
|
|
|
|
|
|
|
|
+>>>>>>> 6a0c5e06dc737368566c8c5b45d8073a39148b99
|