9#include <proto/main.pb.h>
10#include <protocol/protocol_oob.h>
12#include <utils/logging.h>
13#include <utils/streaming_json.h>
19void client::RunStateChangeNotificationHandler::handle(
const run::RunStateChange change,
20 const run::Run &
run,
const char *reason) {
23 auto& run_state_change =
msg.kind.run_state_change_message = pb_RunStateChangeMessage pb_RunStateChangeMessage_init_default;
24 run_state_change.has_run =
true;
25 std::strncpy(run_state_change.run.id,
run.id.c_str(),
sizeof(run_state_change.run.id));
26 run_state_change.run.chunk =
run.next_chunk();
28 run_state_change.has_time =
true;
29 auto& time = run_state_change.time;
30 time.prefix = pb_Prefix_NANO;
31 time.value = change.t;
33 run_state_change.old =
static_cast<pb_RunState
>(change.old);
34 run_state_change.new_ =
static_cast<pb_RunState
>(change.new_);
37 std::strncpy(run_state_change.reason, reason,
sizeof(run_state_change.reason));
40 stream->write(envelope);
48FASTRUN
bool encode_byte_array(pb_ostream_t *stream,
const pb_field_t *field,
void *
const *arg) {
49 if (!pb_encode_tag_for_field(stream, field))
52 auto ptr =
static_cast<SizedPtr*
>(*arg);
53 return pb_encode_string(stream,
static_cast<const uint8_t*
>(ptr->data), ptr->size);
56FASTRUN
void client::RunProtobufDataHandler::prepare(
const run::Run &
run,
size_t channel_count) {
58 auto& run_data =
msg.kind.run_data_message;
59 run_data = pb_RunDataMessage pb_RunDataMessage_init_default;
60 run_data.has_entity =
true;
61 run_data.has_run =
true;
62 std::strncpy(run_data.run.id,
run.id.c_str(),
sizeof(run_data.run.id));
64 auto& entity = run_data.entity;
65 auto& entity_id = carrier::Carrier::get().get_entity_id();
69 ss.read(entity.path,
sizeof(entity.path));
71 run_data.has_data =
true;
72 auto& data = run_data.data;
75 .which_kind = pb_DataType_integer_tag,
78 .signess = pb_IntegerType_Signedness_Unsigned,
84 data.channel_count = channel_count;
87 auto&
carrier = carrier::Carrier::get();
88 auto& adc_channels =
carrier.get_adc_channels();
89 auto& adc_gains =
carrier.get_adc_gains();
90 auto& adc_offsets =
carrier.get_adc_offsets();
92 auto& scaling_idx = data.scaling_count = 0;
93 for (
size_t idx = 0; idx < adc_channels.size(); ++idx) {
94 auto channel = adc_channels[idx];
95 if (channel == carrier::Carrier::ADC_CHANNEL_DISABLED)
continue;
97 constexpr double adc_discrete_gain = -0.00015265824;
98 constexpr double adc_discrete_offset = 1.25;
100 auto adc_gain = adc_gains[idx];
101 auto adc_offset = adc_offsets[idx];
103 auto &scaling = data.scaling[scaling_idx];
105 scaling.gain = adc_discrete_gain * adc_gain;
106 scaling.offset = adc_discrete_offset * adc_gain + adc_offset;
113FASTRUN run::RunHandleResult client::RunProtobufDataHandler::handle(
const run::Run &
run, uint16_t *data,
114 size_t sample_count) {
115 if (sample_count == 0)
return run::RunHandleResult::ok({});
117 auto& message = envelope.kind.message_v1;
118 auto& run_data = message.kind.run_data_message;
120 auto& pb_data = run_data.data;
122 pb_data.sample_count = sample_count;
123 run_data.run.chunk =
run.next_chunk();
124 auto& values = pb_data.data;
127 .size = sample_count * pb_data.channel_count *
sizeof(uint16_t),
128 .data =
reinterpret_cast<uint8_t*
>(data)
130 values.arg = &sized_ptr;
131 return stream->write(envelope);
134run::RunHandleResult client::RunProtobufDataHandler::handle_op_end(
const run::Run &
run,
135 std::array<std::array<float, 8>, 6> data) {
137 auto& run_data =
msg.kind.run_data_end_message;
138 run_data = pb_RunDataEndMessage pb_RunDataEndMessage_init_default;
139 run_data.has_run =
true;
140 std::strncpy(run_data.run.id,
run.id.c_str(),
sizeof(run_data.run.id));
141 run_data.run.chunk =
run.next_chunk();
143 run_data.has_entity =
true;
144 auto& entity = run_data.entity;
145 auto& entity_id = carrier::Carrier::get().get_entity_id();
146 entity_id.copy(entity.path,
sizeof(entity.path));
148 run_data.has_data =
true;
149 auto& data_pb = run_data.data;
150 data_pb.sample_count = 1;
151 data_pb.channel_count = 48;
152 data_pb.has_type =
true;
154 .which_kind = pb_DataType_float__tag,
163 .size = 48 *
sizeof(float),
164 .data =
reinterpret_cast<void*
>(data.data())
168 auto& idx = data_pb.scaling_count = 0;
169 for (; idx < 48; ++idx) {
170 auto& scaling = data_pb.scaling[idx];
173 scaling.offset = 0.0;
177 data_pb.data.arg = &sized_ptr;
178 return stream->write(envelope);
pb_MessageV1 & init_v1_message(pb_Envelope &envelope, pb_size_t which_kind)
FASTRUN bool encode_byte_array(pb_ostream_t *stream, const pb_field_t *field, void *const *arg)