feat: fill bauds, return errors

master
Damanox 7 years ago
parent 0818f9e23a
commit c4f08e7c4d
  1. 81
      sl500.go

@ -2,16 +2,25 @@ package sl500_api
import ( import (
"github.com/tarm/serial" "github.com/tarm/serial"
"fmt"
"log" "log"
"encoding/binary" "encoding/binary"
"bytes" "bytes"
"time"
) )
var Baud = baudRegistry() var Baud = baudRegistry()
func baudRegistry() *baudList { func baudRegistry() *baudList {
return &baudList{ return &baudList{
Baud4800: baud{0, 4800},
Baud9600: baud{1, 9600},
Baud14400: baud{2, 14400},
Baud19200: baud{3, 19200}, Baud19200: baud{3, 19200},
Baud28800: baud{4, 28800},
Baud38400: baud{5, 38400},
Baud57600: baud{6, 57600},
Baud115200: baud{7, 115200},
} }
} }
@ -24,7 +33,14 @@ const (
) )
type baudList struct { type baudList struct {
Baud4800 baud
Baud9600 baud
Baud14400 baud
Baud19200 baud Baud19200 baud
Baud28800 baud
Baud38400 baud
Baud57600 baud
Baud115200 baud
} }
type baud struct { type baud struct {
@ -37,61 +53,82 @@ type Sl500 struct {
port *serial.Port port *serial.Port
} }
func NewConnection(path string, baud baud) Sl500 { func NewConnection(path string, baud baud) (Sl500, error) {
c := &serial.Config{Name: path, Baud: baud.IntValue} // TODO c := &serial.Config{Name: path, Baud: baud.IntValue, ReadTimeout: 5 * time.Second} // TODO
o, err := serial.OpenPort(c) o, err := serial.OpenPort(c)
res := Sl500{}
if err != nil {
return res, err
}
res.config = c
res.port = o
_, err = res.RfInitCom(baud.ByteValue)
if err != nil {
return res, err
}
_, err = res.RfInitType(Type_ISO)
if err != nil {
return res, err
}
_, err = res.RfAntennaSta(AntennaOff)
if err != nil { if err != nil {
log.Fatal(err) return res, err
} }
res := Sl500{config: c, port: o} _, err = res.RfGetDeviceNumber()
log.Println("RfInitCom", res.RfInitCom(baud.ByteValue)) if err != nil {
res.RfInitType(Type_ISO) return res, err
log.Println("AntennaSta", res.RfAntennaSta(AntennaOff)) }
log.Println("Device ID", res.RfGetDeviceNumber())
return res return res, nil
} }
func (s *Sl500) RfInitCom(baud byte) []byte { func (s *Sl500) RfInitCom(baud byte) ([]byte, error) {
sendRequest(s.port, 0x0101, []byte{baud}) sendRequest(s.port, 0x0101, []byte{baud})
return readResponse(s.port) return readResponse(s.port)
} }
func (s *Sl500) RfGetDeviceNumber() []byte { func (s *Sl500) RfGetDeviceNumber() ([]byte, error) {
sendRequest(s.port, 0x0301, []byte{}) sendRequest(s.port, 0x0301, []byte{})
return readResponse(s.port) return readResponse(s.port)
} }
func (s *Sl500) RfAntennaSta(antennaState byte) []byte { func (s *Sl500) RfAntennaSta(antennaState byte) ([]byte, error) {
sendRequest(s.port, 0x0C01, []byte{antennaState}) sendRequest(s.port, 0x0C01, []byte{antennaState})
return readResponse(s.port) return readResponse(s.port)
} }
func (s *Sl500) RfInitType(workType byte) { func (s *Sl500) RfInitType(workType byte) ([]byte, error) {
sendRequest(s.port, 0x0801, []byte{workType}) sendRequest(s.port, 0x0801, []byte{workType})
log.Println("RfInitType", readResponse(s.port)) return readResponse(s.port)
} }
func (s *Sl500) RfBeep(durationMs byte) { func (s *Sl500) RfBeep(durationMs byte) ([]byte, error) {
sendRequest(s.port, 0x0601, []byte{durationMs}) sendRequest(s.port, 0x0601, []byte{durationMs})
log.Println("RfBeep", readResponse(s.port)) return readResponse(s.port)
} }
func readResponse(port *serial.Port) []byte { func readResponse(port *serial.Port) ([]byte, error) {
var buf []byte var buf []byte
innerBuf := make([]byte, 128)
totalRead := 0 totalRead := 0
readTriesCount := 0 readTriesCount := 0
maxReadCount := 50 maxReadCount := 50
for ; ; { for ; ; {
readTriesCount += 1 readTriesCount += 1
if readTriesCount >= maxReadCount { if readTriesCount >= maxReadCount {
break return nil, fmt.Errorf("Reads tries exceeded")
} }
innerBuf := make([]byte, 128)
n, err := port.Read(innerBuf) n, err := port.Read(innerBuf)
if err != nil { if err != nil {
log.Println(err) return nil, err
} }
totalRead += n totalRead += n
@ -107,10 +144,10 @@ func readResponse(port *serial.Port) []byte {
} }
if buf[0] != 0xAA || buf[1] != 0xBB { if buf[0] != 0xAA || buf[1] != 0xBB {
log.Println("shit happens") return nil, fmt.Errorf("Response format invalid")
} }
return buf return buf, nil
} }
func sendRequest(port *serial.Port, commandCode int16, bytesData []byte) { func sendRequest(port *serial.Port, commandCode int16, bytesData []byte) {
buf := new(bytes.Buffer) buf := new(bytes.Buffer)

Loading…
Cancel
Save