2014-10-05 28 views
0

我剛開始使用Preon解碼來自無線電的配置數據(頻道號,頻率,模式,頻道名稱等)。不同的收音機有不同的收音機格式,通常根本不同。 Preon似乎是最完美的解決方案。它的可擴展性。我需要一個BCD解碼器和編碼器

一臺收音機將頻率數據放入BCD(8位數字的頻率存儲在4個字節中)。所以我認爲我需要在Preon開發BCD解碼器和編碼器。我相信我已經閱讀了關於Preon在網絡上可以找到的所有信息,但我不知道如何去解決這個問題。

如果您爲Preon開發了自定義編解碼器,請給我一些關於如何啓動的提示。

回答

0

這個問題很老,但是因爲preon的文檔非常糟糕,所以我會嘗試回答一些這些問題,因爲我最近深入研究這個問題。

前子工程分兩期進行: 創建兆編解碼器,可解碼你問它的類 解碼運行編解碼器

第一階段是由產生編解碼器類第二階段CodecFactory中的類支持。

要註冊一個額外的CodecFactory中,你可以調用前子像這樣:

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。編寫實際的工廠更是一個痛苦的,這樣做,你需要實現創建方法:

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

前子大多經過它的工廠試圖找到一個知道如何處理每一個元素類的列表你問它反序列化。因此,您需要根據元數據和類型參數確定當前要反序列化的類屬性是否是您想要支持的屬性。最有可能的,你要添加註釋@BoundBCD,然後檢查類似

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

對於要處理的情況下,你應該返回至少實現編解碼器接口的解碼方法的編解碼器類(您可能還需要實現getCodecDescriptor,我所做的那個是從列表編解碼器複製並粘貼的)

您將需要創建具有所有相關參數的編解碼器,例如如果你的註解有一個大小字段(或者你從字體大小推斷它),你應該在你的編解碼器中初始化它,然後再返回它,如果它是一個limbo表達式,你應該保存該表達式在編解碼器中進行評估。這樣,當您處於編解碼器的解碼函數中時,您將實際獲得需要運行的所有數據,然後您只需從BitBuffer創建適當類型的對象即可。