11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
24PROMEKI_NAMESPACE_BEGIN
114 using ParseResult = Result<Variant>;
127 using PacketsResult = Result<AncPacket::List>;
132 using ParserFn = ParseResult (*)(
const AncPacket &,
const AncTranslateConfig &);
152 using MultiParserFn = ParseResult (*)(
const AncPacket::List &,
153 const AncTranslateConfig &);
167 using BuilderFn = PacketsResult (*)(
const Variant &,
const AncTranslateConfig &);
181 using TranslatorFn = PacketsResult (*)(
const AncPacket &, AncTransport,
182 const AncTranslateConfig &);
214 using SyncPolicyFn = PacketsResult (*)(
const AncPacket &,
215 FrameSyncDisposition,
217 const AncTranslateConfig &);
222 AncTranslator() =
default;
225 explicit AncTranslator(AncTranslateConfig cfg) : _cfg(std::move(cfg)) {}
228 const AncTranslateConfig &config()
const {
return _cfg; }
231 void setConfig(AncTranslateConfig cfg) { _cfg = std::move(cfg); }
247 ParseResult parse(
const AncPacket &pkt)
const;
269 ParseResult parseGroup(
const AncPacket::List &pkts)
const;
289 PacketsResult build(
const Variant &v,
const AncFormat &fmt,
290 const AncTransport &target)
const;
309 PacketsResult translate(
const AncPacket &pkt,
const AncTransport &target)
const;
330 PacketsResult applySyncPolicy(
const AncPacket &pkt,
331 FrameSyncDisposition disposition,
332 uint8_t repeatIndex)
const;
347 static void registerParser(AncFormat::ID format,
const AncTransport &src, ParserFn fn);
360 static void registerMultiParser(AncFormat::ID format,
const AncTransport &src,
372 static void registerBuilder(AncFormat::ID format,
const AncTransport &dst, BuilderFn fn);
384 static void registerTranslator(AncFormat::ID format,
const AncTransport &src,
385 const AncTransport &dst, TranslatorFn fn);
397 static void registerSyncPolicy(AncFormat::ID format, SyncPolicyFn fn);
407 static bool hasParser(
const AncFormat &format,
const AncTransport &src);
410 static bool hasMultiParser(
const AncFormat &format,
const AncTransport &src);
413 static bool hasBuilder(
const AncFormat &format,
const AncTransport &dst);
416 static bool hasDirectTranslator(
const AncFormat &format,
const AncTransport &src,
417 const AncTransport &dst);
420 static bool hasSyncPolicy(
const AncFormat &format);
431 static bool canTranslate(
const AncFormat &format,
const AncTransport &src,
432 const AncTransport &dst);
435 static List<AncTransport> registeredParserTransports(
const AncFormat &format);
438 static List<AncTransport> registeredBuilderTransports(
const AncFormat &format);
441 AncTranslateConfig _cfg;
464#define PROMEKI_REGISTER_ANC_PARSER(Tag, Format, Transport, Fn) \
466 struct AncParserRegistrar_##Tag { \
467 AncParserRegistrar_##Tag() { \
468 ::promeki::AncTranslator::registerParser(::promeki::AncFormat::Format, \
472 static AncParserRegistrar_##Tag s_anc_parser_registrar_##Tag; \
485#define PROMEKI_REGISTER_ANC_MULTI_PARSER(Tag, Format, Transport, Fn) \
487 struct AncMultiParserRegistrar_##Tag { \
488 AncMultiParserRegistrar_##Tag() { \
489 ::promeki::AncTranslator::registerMultiParser( \
490 ::promeki::AncFormat::Format, Transport, Fn); \
493 static AncMultiParserRegistrar_##Tag s_anc_multi_parser_registrar_##Tag; \
502#define PROMEKI_REGISTER_ANC_BUILDER(Tag, Format, Transport, Fn) \
504 struct AncBuilderRegistrar_##Tag { \
505 AncBuilderRegistrar_##Tag() { \
506 ::promeki::AncTranslator::registerBuilder(::promeki::AncFormat::Format, \
510 static AncBuilderRegistrar_##Tag s_anc_builder_registrar_##Tag; \
526#define PROMEKI_REGISTER_ANC_TRANSLATOR(Tag, Format, Src, Dst, Fn) \
528 struct AncTranslatorRegistrar_##Tag { \
529 AncTranslatorRegistrar_##Tag() { \
530 ::promeki::AncTranslator::registerTranslator(::promeki::AncFormat::Format, \
534 static AncTranslatorRegistrar_##Tag s_anc_translator_registrar_##Tag; \
550#define PROMEKI_REGISTER_ANC_SYNC_POLICY(Tag, Format, Fn) \
552 struct AncSyncPolicyRegistrar_##Tag { \
553 AncSyncPolicyRegistrar_##Tag() { \
554 ::promeki::AncTranslator::registerSyncPolicy(::promeki::AncFormat::Format, \
558 static AncSyncPolicyRegistrar_##Tag s_anc_sync_policy_registrar_##Tag; \