25 auto state_change_handler =
run.state_change_handler.get();
26 auto run_data_handler =
run.data_handler.get();
28 run.daq_config.num_channels = carrier_.get_active_adc_channel_range();
30 if (!run_data_handler) {
31 return Result::err(
"Can not start run without RunDataHandler.");
35 auto on_overload =
run.config.halt_on_overload
36 ? mode::OnOverload::HALT
37 : mode::OnOverload::IGNORE;
41 mode::OnExtHalt::IGNORE,
run.sync_config)) {
42 return Result::err(
"Error while initializing state machine");
46 auto data_stream = daq::stream::get(
run, run_data_handler,
false);
48 auto success = data_stream.start();
50 return Result::err_fmt(
"Error starting data stream: %s",
success.msg.c_str());
55 state_change_handler->handle(
run.to(RunState::TAKE_OFF, millis()),
run);
56 if (!
run.sync_config.enabled) {
59 if (
run.sync_config.is_master) {
64 if (!carrier_.ctrl_block->send_sync(
run.sync_config.id)) {
65 return Result::err(
"Error sending SYNC as master.");
69 elapsedMillis since_takeoff;
71 if (since_takeoff > 5000) {
72 return Result::err(
"Timeout while waiting for SYNC signal.");
77 Result result = Result::ok({});
79 result = data_stream.process();
80 if (result.is_err())
break;
89 delayMicroseconds(20);
92 result = data_stream.process(
true);
95 if (!data_stream.stop())
96 result = Result::err(
"Error while stopping data stream.");
99 if (
run.daq_config.sample_op_end) {
100 std::array<std::array<float, 8>, 6> data_op_end;
101 if (carrier_.measure_all_signals(data_op_end)) {
102 run_data_handler->handle_op_end(
run, data_op_end);
104 result = Result::err(
"Error while measuring OP_END data.");
110 auto &perf = mode::PerformanceCounter::get();
111 perf.add(mode::Mode::IC,
run.config.ic_time / 1000);
112 perf.add(mode::Mode::OP, actual_op_time / 1000);
119 auto change =
run.to(RunState::DONE, actual_op_time);
120 state_change_handler->handle(change,
run);
126 auto state_change_handler =
run.state_change_handler.get();
128 if (!state_change_handler) {
129 LOG_ERROR(
"Can not start run without RunStateChangeHandler");
134 if (
auto msg = result.if_err()) {
135 auto change =
run.to(RunState::ERROR, millis());
136 LOG_ERROR(
msg->c_str());
137 state_change_handler->handle(change,
run,
msg->c_str());