golangで、とりあえずRC-S956に送信するデータだけ作ることにした。
01: package pcd 02: 03: // RawMsg raw data 04: type RawMsg struct { 05: Cmd uint8 06: Data []uint8 07: } 08: 09: // RawEncode encode RC-S956 format 10: func RawEncode(msg *RawMsg) []uint8 { 11: data := make([]uint8, 3+2+1+1+len(msg.Data)+2) 12: data[0] = 0x00 13: data[1] = 0x00 14: data[2] = 0xff 15: data[3] = (uint8)(1 + 1 + len(msg.Data)) 16: data[4] = (uint8)(-data[3]) 17: data[5] = 0xd4 18: data[6] = msg.Cmd 19: copy(data[7:], msg.Data[:]) 20: 21: sum := uint(0xd4 + msg.Cmd) 22: for _, v := range msg.Data { 23: sum += uint(v) 24: } 25: data[7+len(msg.Data)] = uint8(-sum) 26: data[7+len(msg.Data)+1] = 0x00 27: 28: return data 29: } 30: 31: // RawDecode decode RC-S956 format 32: func RawDecode(data []uint8) *RawMsg { 33: return new(RawMsg) 34: }
たったこれだけ(しかもDecodeはやってない)のだが、けっこう時間がかかった。
structの形を決める
私はどうも、汎用的に作るのが苦手だし、拡張とか考えるのも苦手なようだ。
今回はgolangなので、メモリの確保については悩まずに済むし、ステップ数を減らす努力もしなくてよいだろう。
0x00の代入は省略しようかどうかと多少悩んだのだが、そこはコンパイラに任せよう。
データ構造としては、書いていた方がわかりやすいから、今回は書いた。
0xD4がメインコマンドなのだが、それはもう取り込んだ形にした。
わざわざメインコマンドとサブコマンドをユーザに指定させる必要はあるまい。
そもそも、0xD4以外で始まるパターンってよく知らんし。
というわけで、structはサブコマンドとそのパラメータのみになった。
パラメータはmakeして渡すイメージだ。
packageパス
またしてもpackageパスに悩まされた。
今回はmainパッケージは呼ぶだけにするつもりなので、github.com/hirokuma/go_pasori370/cmdの下にmain.goを置くことにした。
それ以外はgithub.com/hirokuma/go_pasori370/pcdに。
main.goでimportするのは"github.com/hirokuma/go_pasori370/pcd"でよかったのだが、go runするパスがよくわからなくなった。
# これはOK
src/github.com/hirokuma/go_pasori370/cmd $ go run .
src/github.com/hirokuma/go_pasori370/cmd $ go run github.com/hirokuma/go_pasori370/cmd# これはNG
src/github.com/hirokuma/go_pasori370 $ go run cmd
src/github.com/hirokuma/go_pasori370 $ go run cmd/.
カレントディレクトリはいいけど、パス名が入った途端にsrcからの絶対パスと判定されるのか。
rangeの戻り値
作ったのは良かったのだが、DCSの値があわなかった。
forでぐるぐる回して足しているところだ。
for v := range msg.Data {
sum += uint(v)
}
これは、ダメなのね。
正しくは、こう。
for _, v := range msg.Data {
sum += uint(v)
}
あー、あるある~、って言ってほしいところであった。
01: package main 02: 03: import ( 04: "encoding/hex" 05: "log" 06: 07: "github.com/hirokuma/go_pasori370/pcd" 08: ) 09: 10: func main() { 11: var msg pcd.RawMsg 12: 13: msg.Cmd = 0x18 14: msg.Data = []uint8{0x01} 15: data := pcd.RawEncode(&msg) 16: log.Printf("data: %s\n", hex.Dump(data)) 17: }
$ go run github.com/hirokuma/go_pasori370/cmd
2020/03/07 20:52:12 data: 00000000 00 00 ff 03 fd d4 18 01 13 00 |..........|
久々すぎて値に自信がないのだが、まあ実際に流して見れば分かるだろう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。