11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
26PROMEKI_NAMESPACE_BEGIN
116 using ParseResult = Result<Variant>;
129 using PacketsResult = Result<AncPacket::List>;
134 using ParserFn = ParseResult (*)(
const AncPacket &,
const AncTranslateConfig &);
154 using MultiParserFn = ParseResult (*)(
const AncPacket::List &,
155 const AncTranslateConfig &);
169 using BuilderFn = PacketsResult (*)(
const Variant &,
const AncTranslateConfig &);
183 using TranslatorFn = PacketsResult (*)(
const AncPacket &, AncTransport,
184 const AncTranslateConfig &);
216 using SyncPolicyFn = PacketsResult (*)(
const AncPacket &,
217 FrameSyncDisposition,
219 const AncTranslateConfig &);
248 using DetailerFn = AncDetails (*)(
const AncPacket &,
const AncTranslateConfig &);
253 AncTranslator() =
default;
256 explicit AncTranslator(AncTranslateConfig cfg) : _cfg(std::move(cfg)) {}
259 const AncTranslateConfig &config()
const {
return _cfg; }
262 void setConfig(AncTranslateConfig cfg) { _cfg = std::move(cfg); }
278 ParseResult parse(
const AncPacket &pkt)
const;
305 String describe(
const AncPacket &pkt, Error *err =
nullptr)
const;
343 AncDetails details(
const AncPacket &pkt)
const;
365 ParseResult parseGroup(
const AncPacket::List &pkts)
const;
385 PacketsResult build(
const Variant &v,
const AncFormat &fmt,
386 const AncTransport &target)
const;
405 PacketsResult translate(
const AncPacket &pkt,
const AncTransport &target)
const;
426 PacketsResult applySyncPolicy(
const AncPacket &pkt,
427 FrameSyncDisposition disposition,
428 uint8_t repeatIndex)
const;
443 static void registerParser(AncFormat::ID format,
const AncTransport &src, ParserFn fn);
456 static void registerMultiParser(AncFormat::ID format,
const AncTransport &src,
468 static void registerBuilder(AncFormat::ID format,
const AncTransport &dst, BuilderFn fn);
480 static void registerTranslator(AncFormat::ID format,
const AncTransport &src,
481 const AncTransport &dst, TranslatorFn fn);
493 static void registerSyncPolicy(AncFormat::ID format, SyncPolicyFn fn);
506 static void registerDetailer(AncFormat::ID format,
const AncTransport &src, DetailerFn fn);
516 static bool hasParser(
const AncFormat &format,
const AncTransport &src);
519 static bool hasMultiParser(
const AncFormat &format,
const AncTransport &src);
522 static bool hasBuilder(
const AncFormat &format,
const AncTransport &dst);
525 static bool hasDirectTranslator(
const AncFormat &format,
const AncTransport &src,
526 const AncTransport &dst);
529 static bool hasSyncPolicy(
const AncFormat &format);
540 static bool hasDetailer(
const AncFormat &format,
const AncTransport &src);
551 static bool canTranslate(
const AncFormat &format,
const AncTransport &src,
552 const AncTransport &dst);
555 static List<AncTransport> registeredParserTransports(
const AncFormat &format);
558 static List<AncTransport> registeredBuilderTransports(
const AncFormat &format);
561 AncTranslateConfig _cfg;
584#define PROMEKI_REGISTER_ANC_PARSER(Tag, Format, Transport, Fn) \
586 struct AncParserRegistrar_##Tag { \
587 AncParserRegistrar_##Tag() { \
588 ::promeki::AncTranslator::registerParser(::promeki::AncFormat::Format, \
592 static AncParserRegistrar_##Tag s_anc_parser_registrar_##Tag; \
605#define PROMEKI_REGISTER_ANC_MULTI_PARSER(Tag, Format, Transport, Fn) \
607 struct AncMultiParserRegistrar_##Tag { \
608 AncMultiParserRegistrar_##Tag() { \
609 ::promeki::AncTranslator::registerMultiParser( \
610 ::promeki::AncFormat::Format, Transport, Fn); \
613 static AncMultiParserRegistrar_##Tag s_anc_multi_parser_registrar_##Tag; \
622#define PROMEKI_REGISTER_ANC_BUILDER(Tag, Format, Transport, Fn) \
624 struct AncBuilderRegistrar_##Tag { \
625 AncBuilderRegistrar_##Tag() { \
626 ::promeki::AncTranslator::registerBuilder(::promeki::AncFormat::Format, \
630 static AncBuilderRegistrar_##Tag s_anc_builder_registrar_##Tag; \
646#define PROMEKI_REGISTER_ANC_TRANSLATOR(Tag, Format, Src, Dst, Fn) \
648 struct AncTranslatorRegistrar_##Tag { \
649 AncTranslatorRegistrar_##Tag() { \
650 ::promeki::AncTranslator::registerTranslator(::promeki::AncFormat::Format, \
654 static AncTranslatorRegistrar_##Tag s_anc_translator_registrar_##Tag; \
670#define PROMEKI_REGISTER_ANC_SYNC_POLICY(Tag, Format, Fn) \
672 struct AncSyncPolicyRegistrar_##Tag { \
673 AncSyncPolicyRegistrar_##Tag() { \
674 ::promeki::AncTranslator::registerSyncPolicy(::promeki::AncFormat::Format, \
678 static AncSyncPolicyRegistrar_##Tag s_anc_sync_policy_registrar_##Tag; \
694#define PROMEKI_REGISTER_ANC_DETAILER(Tag, Format, Transport, Fn) \
696 struct AncDetailerRegistrar_##Tag { \
697 AncDetailerRegistrar_##Tag() { \
698 ::promeki::AncTranslator::registerDetailer(::promeki::AncFormat::Format, \
702 static AncDetailerRegistrar_##Tag s_anc_detailer_registrar_##Tag; \