0

Preon を使用して、無線からの構成データ (チャネル番号、周波数、モード、チャネル名など) をデコードし始めたところです。異なるラジオには異なるラジオ形式があり、通常は根本的に異なります。Preon は完璧なソリューションのようです。そしてその拡張可能。

1 つのラジオは、周波数データを BCD に配置します (8 桁の周波数が 4 バイトに格納されます)。したがって、Preon で BCD デコーダーとエンコーダーを開発する必要があると思います。Web で Preon について見つけられるすべての情報を読んだと思いますが、これについてどうすればよいかわかりません。

Preon 用のカスタム コーデックを開発したことがある場合は、開始方法のヒントを教えてください。

4

1 に答える 1

0

この質問は非常に古いものですが、preon のドキュメントはかなりひどいので、最近これを掘り下げたので、これらの質問のいくつかに答えようと思います。

Preon は次の 2 つのフェーズで動作します。 デコードを要求したクラスをデコードできる Mega-Codec の作成 コーデックの実行

第 1 フェーズは、第 2 フェーズの Codec クラスを生成する CodecFactory クラスによってサポートされます。

追加の CodecFactory を登録するには、次のように preon を呼び出します。

    DefaultCodecFactory fact = new DefaultCodecFactory();

    CodecFactory someFactory = new DefaultCodecFactory();

    CodecFactory[] additional = new CodecFactory[1];
    additional[0] = someFactory;

    Codec<MyClass> myCodec =  fact.create(null, MyClass.class, additional,
            new CodecDecorator[0], new BindingDecorator[0]);

    MyClass result = Codecs.decode(myCodec, buffer);

someFactory を実際の工場に置き換えるだけです。実際のファクトリを書くのは面倒です。そのためには、create メソッドを実装する必要があります。

public <T> Codec<T> create(AnnotatedElement metadata, Class<T> type,
                           ResolverContext context) {

Preon はほとんどの場合、ファクトリのリストを調べて、逆シリアル化するように要求されたクラス内のすべての要素を処理する方法を知っているファクトリを見つけようとします。したがって、メタデータと型パラメーターに基づいて、逆シリアル化する現在のクラス プロパティがサポートしたいものであるかどうかを判断する必要があります。ほとんどの場合、@BoundBCD アノテーションを追加してから、次のようなチェックを行います。

metadata.getAnnotation(BoundBCD.class)) != null

処理したいケースでは、少なくとも Codec インターフェイスのデコード メソッドを実装する Codec クラスを返す必要があります (getCodecDescriptor も実装する必要があるかもしれません。私が作成したものには、リスト コーデックからコピー アンド ペーストされたものがあります)。

関連するすべてのパラメーターを使用してこのコーデックを作成する必要があります。たとえば、注釈にサイズ フィールドがある場合 (または型のサイズから推測している場合)、それを返す前にコーデックで初期化する必要があります。式である場合、その式を評価用にコーデックに保存する必要があります。そうすれば、コーデックのデコード機能を使用しているときに、実際に実行する必要があるすべてのデータが得られ、BitBuffer から適切に型指定されたオブジェクトを作成するだけで済みます。

于 2015-02-11T04:33:05.427 に答える