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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。