2020/03/07

[golang]RC-S956 encode部分だけ

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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。