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...