summaryrefslogtreecommitdiff
path: root/cmd/ipp/main.go
blob: 16317e00b3828d23c8a60797a4feb835ff1d199f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package main

import (
	"encoding/hex"
	"flag"
	"log"
	"strconv"
	"time"

	"pm3.dev/cvend"
)

var wait = flag.Duration("w", 5*time.Second, "how long to wait for a response")
var follow = flag.Bool("f", false, "don't exit after response")

func main() {
	flag.Parse()
	log.SetFlags(log.Lshortfile)
	wc := make(chan struct{}, 1)
	cv, err := cvend.Open(cvend.Path, func(msgType byte, msgData []byte) {
		log.Printf("ipp %02x\n%s", msgType, hex.Dump(msgData))
		select {
		case wc <- struct{}{}:
		default:
		}
	})
	if err != nil {
		panic(err)
	}
	defer cv.Close()
	for i := 0; i < flag.NArg(); i += 2 {
		var msgType byte
		var msgData []byte
		if n, err := strconv.ParseUint(flag.Arg(i), 0, 8); err != nil {
			panic(err)
		} else {
			msgType = byte(n)
		}
		if bs, err := hex.DecodeString(flag.Arg(i + 1)); err != nil {
			panic(err)
		} else {
			msgData = bs
		}
		if err := cv.SendIPP(msgType, msgData); err != nil {
			panic(err)
		}
		if *wait > 0 {
			select {
			case <-wc:
			case <-time.After(*wait):
			}
		}
	}
	if *follow || flag.NArg() == 0 {
		select {}
	}
}