#include <dlt698/app.hpp>
#include <dlt698/standard/catalog.hpp>
#include <iostream>
int main() {
using namespace dlt698;
namespace oi = standard::oi;
const standard::DeviceLayout layout{standard::Wiring::three_phase, 4, 21};
app::ClientOptions options;
options.protocol.server.bytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
app::Client client(options);
auto connected = client.connect_tcp("127.0.0.1", 6980);
if (!connected) {
std::cerr << connected.error().context << '\n';
return 1;
}
auto freq = standard::make_oad(oi::frequency, 2, 0, layout);
auto temp = standard::make_oad(oi::internal_temperature, 2, 0, layout);
if (!freq || !temp) {
std::cerr << "bad layout\n";
client.disconnect();
return 1;
}
auto response = client.get_list({freq.value(), temp.value()});
if (!response) {
std::cerr << response.error().context << '\n';
client.disconnect();
return 1;
}
// get_list 返回完整 GetResponse:外层成功只表示传输成功,
// 每项仍要单独判断是 DAR 还是 Data —— 这就是"部分成功"。
const auto& attributes = response.value().attributes;
static const char* kNames[] = {"frequency", "temperature"};
for (std::size_t i = 0; i < attributes.size(); ++i) {
const auto& entry = attributes[i];
if (const auto dar = std::get_if<std::uint8_t>(&entry.result)) {
std::cerr << kNames[i] << " unsupported, DAR=" << unsigned(*dar) << '\n';
continue;
}
// 建议按回显的 OAD 决定如何解释,而不是依赖请求顺序。
const model::Oad& oad = entry.attribute;
const auto& data = std::get<model::Data>(entry.result);
auto numbers = standard::engineering_values(oad, data, layout);
if (numbers && !numbers.value().empty())
std::cout << (oad.oi == oi::frequency ? "frequency" : "temperature") << " = "
<< standard::decimal_text(numbers.value()[0]) << ' '
<< standard::unit_symbol(numbers.value()[0].scaling.unit) << '\n';
}
// 输出:
// frequency = 50.00 Hz
// temperature = 35.2 ℃
client.disconnect();
return 0;
}