使用DSL優雅的實現串列埠協議

2021-08-13 06:58:13 字數 1853 閱讀 7750

kotlin**:

fun ledonboardinstruction(index: byte, ledindex: byte, r: short, g: short, b: short) =

rj25instruction

這段**的作用,是完成這樣一條藍芽串列埠協議:

協議需要的是動態計算的,長度不定的byte陣列,能寫成這樣,酷不酷炫,想不想學?

domain-specific language,領域特定語言,定義自行看維基百科,以下是我個人的總結:

fun rj25instruction(init: rj25instruction.() -> unit): rj25instruction
所以這段**的作用為新建乙個rj25instruction類,依次執行這個類的這些方法:

index(index)

mode(modewrite)

command(commandled)

port(7)

slot(2)

data

(ledindex)

data

(r)data

(g)data

(b)

當然在這些之前,還有rj25instruction內部定義的初始化方法:

init
對照著文件,是不是一目了然?

- 內部的函式:

private fun head() = addchild(arraybyteelement(headbytes))

private fun length() = addchild(lengthelement)

fun index(byte: byte)

fun mode(byte: byte) = addchild(byteelement(byte))

fun command(byte: byte) = addchild(byteelement(byte))

fun port(byte: byte) = addchild(byteelement(byte))

fun slot(byte: byte) = addchild(byteelement(byte))

fun secondarycommand(byte: byte) = addchild(byteelement(byte))

fundata

(byte: byte) = addchild(byteelement(byte))

fundata

(int: int) = addchild(intelement(int))

fundata

(float: float) = addchild(floatelement(float))

fundata

(short: short) = addchild(shortelement(short))

fundata

(bytes: array

) = addchild(arraybyteelement(bytes))

override fun getbytes(): bytearray

private fun calculatelength()

更加深入的**就沒有必要貼出來了,也就是更進一步的轉換資料而已,到這裡可以很明顯的看出實現dsl的思路了,使用lambda 表示式來構建builder,已經明白了吧?如果這都還不懂,建議溫習下stringbuilder的用法~~

6種串列埠協議的實現

串列埠協議開發 以下解析正規化都是採用資料佇列的形似來儲存,並且根據裝置執行速度差異,還需增加資料報佇列來儲存解析完畢的資料報 1.正規化一 固定長度 無校驗 0x6b 20位元組 0xb6 上面資料中有乙個幀頭0x6b,幀尾0xb6,中間資料20個。每次資料要找到幀頭0x6b才開始儲存,讀取完22...

Linux 上串列埠PRC 協議的實現

最近一直在研究如何實高效能cortex a 處理器在工業控制,物聯網領域的應用。cortex a 核心的soc 晶元通常執行linux os 直接支援的硬體介面不多,而且不夠靈活。我們傾向採用cortex m 微控制器作為cortex a的擴充套件io來使用。為了提高軟體研發的效率cortex m ...

Swift 優雅的協議擴充套件

先看呼叫效果 123456 yy str.md5forlower32bate 123456 yy str.md5forlower32bate 類似 view.snp.為什麼要這麼做呢?好處在哪呢?降低耦合度 傳統的寫法,直接在類別中新增乙個方法或屬性例如 extension string d d x...