25 auto run_data_handler =
run.data_handler.get();
27 run.daq_config.num_channels = carrier_.get_active_adc_channel_range();
29 if (!run_data_handler) {
30 return UnitResult::err(
"Can not start run without RunDataHandler.");
34 auto on_overload =
run.config.halt_on_overload
35 ? mode::OnOverload::HALT
36 : mode::OnOverload::IGNORE;
40 mode::OnExtHalt::IGNORE,
run.sync_config)) {
41 return UnitResult::err(
"Error while initializing state machine");
45 auto data_stream = daq::stream::get(
run, run_data_handler,
false);
47 auto success = data_stream.start();
49 return UnitResult::err_fmt(
"Error starting data stream: %s",
success.err_value().c_str());
54 run_data_handler->handle(
run.to(RunState::TAKE_OFF, millis()),
run);
55 if (!
run.sync_config.enabled) {
58 if (
run.sync_config.is_master) {
63 if (!carrier_.ctrl_block->send_sync(
run.sync_config.id)) {
64 return UnitResult::err(
"Error sending SYNC as master.");
68 elapsedMillis since_takeoff;
70 if (since_takeoff > 5000) {
71 return UnitResult::err(
"Timeout while waiting for SYNC signal.");
76 UnitResult result = UnitResult::ok();
78 result = data_stream.process();
79 if (result.is_err())
break;
88 delayMicroseconds(20);
91 result <<= data_stream.process(
true);
94 if (!data_stream.stop())
95 result <<= UnitResult::err(
"Error while stopping data stream.");
98 if (
run.daq_config.sample_op_end) {
99 std::array<std::array<float, 8>, 6> data_op_end;
100 if (carrier_.measure_all_signals(data_op_end)) {
101 run_data_handler->handle_op_end(
run, data_op_end);
103 result <<= UnitResult::err(
"Error while measuring OP_END data.");
109 auto &perf = mode::PerformanceCounter::get();
110 perf.add(mode::Mode::IC,
run.config.ic_time / 1000);
111 perf.add(mode::Mode::OP, actual_op_time / 1000);
116 return FlexioResult::ok(actual_op_time);
120 auto data_handler =
run.data_handler.get();
123 LOG_ERROR(
"Can not start run without RunDataHandler");
129 if (
auto msg = result.as_err()) {
130 auto change =
run.to(RunState::ERROR, millis());
131 LOG_ERROR(
msg->c_str());
132 data_handler->handle(change,
run,
msg->c_str());
134 auto change =
run.to(RunState::DONE, result.ok_value());
135 data_handler->handle(change,
run);