23int main(
int argc,
char* argv[]) {
25 std::cerr <<
"Usage: " << argv[0] <<
" <db_port> [messages_per_type]" << std::endl;
26 std::cerr <<
"Example: " << argv[0] <<
" 2240 10" << std::endl;
30 uint16_t
port = std::stoi(argv[1]);
31 int messages_per_type = (argc > 2) ? std::stoi(argv[2]) : 10;
33 std::cout <<
"\n๐งช Sending fake data for ALL sensor types to Elodin" << std::endl;
34 std::cout <<
"===================================================" << std::endl;
35 std::cout <<
"Database: 127.0.0.1:" <<
port << std::endl;
36 std::cout <<
"Messages per type: " << messages_per_type << std::endl;
37 std::cout <<
"Sensor types: PT, TC, RTD, LC" << std::endl;
38 std::cout <<
"===================================================\n" << std::endl;
42 daq_comms::elodin::ElodinClient client;
43 if (!client.connect(
"127.0.0.1",
port)) {
44 std::cerr <<
"โ Failed to connect to Elodin DB: " << client.last_error() << std::endl;
47 std::cout <<
"โ
Connected to Elodin DB" << std::endl;
50 if (!daq_comms::elodin::DatabaseConfig::register_tables(client)) {
51 std::cerr <<
"โ Failed to register tables" << std::endl;
54 std::cout <<
"โ
Registered all VTables" << std::endl;
57 std::cout <<
"โณ Waiting 5 seconds for Elodin to fully process VTable registrations..."
59 std::this_thread::sleep_for(std::chrono::milliseconds(5000));
62 std::array<uint8_t, 2> pt_packet_id{0x20, 0x00};
63 std::array<uint8_t, 2> tc_packet_id{0x21, 0x00};
64 std::array<uint8_t, 2> rtd_packet_id{0x22, 0x00};
65 std::array<uint8_t, 2> lc_packet_id{0x23, 0x00};
67 auto start_time = std::chrono::steady_clock::now();
69 std::cout <<
"\n๐ค Starting REAL-TIME data transmission (interleaved)..." << std::endl;
70 std::cout <<
" Rate: ~10 Hz (all sensor types sent together every 100ms)" << std::endl;
71 std::cout <<
" Pattern: PT โ TC โ RTD โ LC (repeated)" << std::endl;
72 std::cout << std::endl;
75 for (
int i = 0; i < messages_per_type; ++i) {
76 auto now = std::chrono::steady_clock::now();
77 auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time);
78 uint64_t timestamp_ns =
elapsed.count();
79 uint32_t sample_timestamp_ms = i * 100;
85 msg.
setField<1>(
static_cast<uint8_t
>(i % 3));
86 msg.
setField<2>(std::array<uint8_t, 3>{0, 0, 0});
88 msg.
setField<4>(sample_timestamp_ms);
91 if (!client.publish(pt_packet_id, msg)) {
92 std::cerr <<
"โ Failed to publish PT message #" << (i + 1) << std::endl;
100 msg.
setField<1>(
static_cast<uint8_t
>(i % 2));
101 msg.
setField<2>(std::array<uint8_t, 3>{0, 0, 0});
103 msg.
setField<4>(sample_timestamp_ms);
106 if (!client.publish(tc_packet_id, msg)) {
107 std::cerr <<
"โ Failed to publish TC message #" << (i + 1) << std::endl;
115 msg.
setField<1>(
static_cast<uint8_t
>(i % 2));
116 msg.
setField<2>(std::array<uint8_t, 3>{0, 0, 0});
118 msg.
setField<4>(sample_timestamp_ms);
121 if (!client.publish(rtd_packet_id, msg)) {
122 std::cerr <<
"โ Failed to publish RTD message #" << (i + 1) << std::endl;
130 msg.
setField<1>(
static_cast<uint8_t
>(0));
131 msg.
setField<2>(std::array<uint8_t, 3>{0, 0, 0});
133 msg.
setField<4>(sample_timestamp_ms);
136 if (!client.publish(lc_packet_id, msg)) {
137 std::cerr <<
"โ Failed to publish LC message #" << (i + 1) << std::endl;
142 if (i < 5 || i % 10 == 0) {
143 std::cout <<
"[send_all_sensors] โ
Sent batch #" << (i + 1)
144 <<
" (PT+TC+RTD+LC, timestamp=" << timestamp_ns <<
"ns)" << std::endl;
148 std::this_thread::sleep_for(std::chrono::milliseconds(100));
151 std::cout <<
"\n โ
Sent " << messages_per_type
152 <<
" batches (4 messages each = " << (messages_per_type * 4) <<
" total messages)"
155 client.flush_buffer();
157 auto end_time = std::chrono::steady_clock::now();
159 std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
161 std::cout <<
"\n===================================" << std::endl;
162 std::cout <<
"โ
Transmission Complete!" << std::endl;
163 std::cout <<
" Total messages sent: " << (messages_per_type * 4) << std::endl;
164 std::cout <<
" Duration: " << duration.count() <<
" ms" << std::endl;
165 std::cout <<
"===================================" << std::endl;
166 std::cout <<
"\n๐ View data in Elodin editor:" << std::endl;
167 std::cout <<
" elodin editor <db_path>" << std::endl;
168 std::cout << std::endl;
172 }
catch (
const std::exception& e) {
173 std::cerr <<
"โ Error: " << e.what() << std::endl;
CommsMessage< uint64_t, uint8_t, std::array< uint8_t, 3 >, uint32_t, uint32_t, uint8_t > RawTCMessage
Raw Thermocouple sample message for Elodin CRITICAL: Includes padding bytes to ensure uint32_t fields...
CommsMessage< uint64_t, uint8_t, std::array< uint8_t, 3 >, uint32_t, uint32_t, uint8_t > RawRTDMessage
Raw RTD sample message for Elodin CRITICAL: Includes padding bytes to ensure uint32_t fields are 4-by...
CommsMessage< uint64_t, uint8_t, std::array< uint8_t, 3 >, uint32_t, uint32_t, uint8_t > RawLCMessage
Raw Load Cell sample message for Elodin CRITICAL: Includes padding bytes to ensure uint32_t fields ar...
CommsMessage< uint64_t, uint8_t, std::array< uint8_t, 3 >, uint32_t, uint32_t, uint8_t > RawPTMessage
Raw Pressure Transducer sample message for Elodin.