gobm65.go
author Mikael Berthe <mikael@lilotux.net>
Thu, 05 Feb 2015 23:24:06 +0100
changeset 0 98ca96e114b2
child 1 05b31eb60d27
permissions -rw-r--r--
Initial version
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
package main
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
import (
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
	"io"
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
	"fmt"
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
	"log"
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
	"github.com/tarm/goserial"
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
type measurement struct {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
	header    int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
	systolic  int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
	diastolic int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
	pulse     int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
	month     int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
	day       int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
	hour      int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
	minute    int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
	year      int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
func getData(s io.ReadWriteCloser, buf []byte, size int) (int, error) {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
	t := 0
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
	b := buf
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
	for t < size {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
		n, err := s.Read(b[t:])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
		if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
			log.Fatal(err) // XXX
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
			return t, err
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
		}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
		//log.Printf("(%d bytes) %q\n", n, b[t:t+1])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
		t = t + n
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
	return t, nil
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
func main() {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
	c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 4800}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
	s, err := serial.OpenPort(c)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
	if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
		log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
	q := []byte("\xaa")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
	//log.Printf("Query: %q\n", q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
	log.Println("Starting handshake...")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
	n, err := s.Write(q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
	if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
		log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
	buf := make([]byte, 128)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
	n, err = getData(s, buf, 1)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
	if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
		log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
	if n == 1 && buf[0] == '\x55' {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
		log.Println("Handshake successful.")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
	} else {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
		log.Printf("(%d bytes) %q\n", n, buf[:n])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
		s.Close()
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
	// =================== Desc =====================
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
	q = []byte("\xa4")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
	//log.Printf("Query: %q\n", q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
	log.Println("Requesting device description...")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
	n, err = s.Write(q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
	if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
		log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
	n, err = getData(s, buf, 32)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
	log.Printf("DESC> %q\n", buf[:n])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
	// =================== Count =====================
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
	q = []byte("\xa2")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
	//log.Printf("Query: %q\n", q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
	log.Println("Requesting data counter...")
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
	n, err = s.Write(q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
	if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
		log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
	n, err = getData(s, buf, 1)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
	if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
		log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
	var nRecords int
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
	if n == 1 {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
		log.Printf("%d item(s) available.", buf[0])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
		nRecords = int(buf[0])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
	} else {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
		log.Printf("(%d bytes) %q\n", n, buf[:n])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
		return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
	for i := 0; i < nRecords; i++ {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
		q = []byte{'\xa3', uint8(i + 1)}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
		//log.Printf("Query: %q\n", q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
		//log.Printf("Requesting measurement %d...", i+1)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
		n, err = s.Write(q)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
		if err != nil {
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
			log.Fatal(err)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
			return
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
		}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
		n, err = getData(s, buf, 9)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
		//log.Printf("DESC> %q\n", buf[:n])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   119
		var data measurement
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   120
		data.header = int(buf[0])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   121
		data.systolic = int(buf[1]) + 25
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   122
		data.diastolic = int(buf[2]) + 25
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   123
		data.pulse = int(buf[3])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   124
		data.month = int(buf[4])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   125
		data.day = int(buf[5])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   126
		data.hour = int(buf[6])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   127
		data.minute = int(buf[7])
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   128
		data.year = int(buf[8]) + 2000
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   129
		fmt.Printf("%d;%x;%d-%02d-%02d %02d:%02d;%d;%d;%d\n",
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   130
			i+1, data.header,
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   131
			data.year, data.month, data.day,
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   132
			data.hour, data.minute,
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   133
			data.systolic, data.diastolic, data.pulse)
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   134
	}
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   135
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   136
	s.Close()
98ca96e114b2 Initial version
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   137
}