parent
c8094e5568
commit
0818f9e23a
@ -0,0 +1,21 @@ |
|||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. |
||||||
|
|
||||||
|
|
||||||
|
[[projects]] |
||||||
|
branch = "master" |
||||||
|
name = "github.com/tarm/serial" |
||||||
|
packages = ["."] |
||||||
|
revision = "eaafced92e9619f03c72527efeab21e326f3bc36" |
||||||
|
|
||||||
|
[[projects]] |
||||||
|
branch = "master" |
||||||
|
name = "golang.org/x/sys" |
||||||
|
packages = ["unix"] |
||||||
|
revision = "63fc586f45fe72d95d5240a5d5eb95e6503907d3" |
||||||
|
|
||||||
|
[solve-meta] |
||||||
|
analyzer-name = "dep" |
||||||
|
analyzer-version = 1 |
||||||
|
inputs-digest = "f9a6c4dc440e8e3650be246784e2d7235f7da18d7cda545e30bdaca21f549100" |
||||||
|
solver-name = "gps-cdcl" |
||||||
|
solver-version = 1 |
@ -0,0 +1,30 @@ |
|||||||
|
# Gopkg.toml example |
||||||
|
# |
||||||
|
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md |
||||||
|
# for detailed Gopkg.toml documentation. |
||||||
|
# |
||||||
|
# required = ["github.com/user/thing/cmd/thing"] |
||||||
|
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] |
||||||
|
# |
||||||
|
# [[constraint]] |
||||||
|
# name = "github.com/user/project" |
||||||
|
# version = "1.0.0" |
||||||
|
# |
||||||
|
# [[constraint]] |
||||||
|
# name = "github.com/user/project2" |
||||||
|
# branch = "dev" |
||||||
|
# source = "github.com/myfork/project2" |
||||||
|
# |
||||||
|
# [[override]] |
||||||
|
# name = "github.com/x/y" |
||||||
|
# version = "2.4.0" |
||||||
|
# |
||||||
|
# [prune] |
||||||
|
# non-go = false |
||||||
|
# go-tests = true |
||||||
|
# unused-packages = true |
||||||
|
|
||||||
|
|
||||||
|
[prune] |
||||||
|
go-tests = true |
||||||
|
unused-packages = true |
@ -0,0 +1,137 @@ |
|||||||
|
package sl500_api |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/tarm/serial" |
||||||
|
"log" |
||||||
|
"encoding/binary" |
||||||
|
"bytes" |
||||||
|
) |
||||||
|
|
||||||
|
var Baud = baudRegistry() |
||||||
|
|
||||||
|
func baudRegistry() *baudList { |
||||||
|
return &baudList{ |
||||||
|
Baud19200: baud{3, 19200}, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const ( |
||||||
|
Type_A = byte(0xA) |
||||||
|
Type_B = byte(0xB) |
||||||
|
Type_ISO = byte(0x1) |
||||||
|
AntennaOn = byte(0x1) |
||||||
|
AntennaOff = byte(0x0) |
||||||
|
) |
||||||
|
|
||||||
|
type baudList struct { |
||||||
|
Baud19200 baud |
||||||
|
} |
||||||
|
|
||||||
|
type baud struct { |
||||||
|
ByteValue byte |
||||||
|
IntValue int |
||||||
|
} |
||||||
|
|
||||||
|
type Sl500 struct { |
||||||
|
config *serial.Config |
||||||
|
port *serial.Port |
||||||
|
} |
||||||
|
|
||||||
|
func NewConnection(path string, baud baud) Sl500 { |
||||||
|
c := &serial.Config{Name: path, Baud: baud.IntValue} // TODO
|
||||||
|
o, err := serial.OpenPort(c) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
res := Sl500{config: c, port: o} |
||||||
|
log.Println("RfInitCom", res.RfInitCom(baud.ByteValue)) |
||||||
|
res.RfInitType(Type_ISO) |
||||||
|
log.Println("AntennaSta", res.RfAntennaSta(AntennaOff)) |
||||||
|
log.Println("Device ID", res.RfGetDeviceNumber()) |
||||||
|
|
||||||
|
return res |
||||||
|
} |
||||||
|
|
||||||
|
func (s *Sl500) RfInitCom(baud byte) []byte { |
||||||
|
sendRequest(s.port, 0x0101, []byte{baud}) |
||||||
|
return readResponse(s.port) |
||||||
|
} |
||||||
|
|
||||||
|
func (s *Sl500) RfGetDeviceNumber() []byte { |
||||||
|
sendRequest(s.port, 0x0301, []byte{}) |
||||||
|
return readResponse(s.port) |
||||||
|
} |
||||||
|
func (s *Sl500) RfAntennaSta(antennaState byte) []byte { |
||||||
|
sendRequest(s.port, 0x0C01, []byte{antennaState}) |
||||||
|
return readResponse(s.port) |
||||||
|
} |
||||||
|
func (s *Sl500) RfInitType(workType byte) { |
||||||
|
sendRequest(s.port, 0x0801, []byte{workType}) |
||||||
|
log.Println("RfInitType", readResponse(s.port)) |
||||||
|
} |
||||||
|
func (s *Sl500) RfBeep(durationMs byte) { |
||||||
|
sendRequest(s.port, 0x0601, []byte{durationMs}) |
||||||
|
log.Println("RfBeep", readResponse(s.port)) |
||||||
|
} |
||||||
|
func readResponse(port *serial.Port) []byte { |
||||||
|
var buf []byte |
||||||
|
totalRead := 0 |
||||||
|
readTriesCount := 0 |
||||||
|
maxReadCount := 50 |
||||||
|
for ; ; { |
||||||
|
readTriesCount += 1 |
||||||
|
|
||||||
|
if readTriesCount >= maxReadCount { |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
innerBuf := make([]byte, 128) |
||||||
|
n, err := port.Read(innerBuf) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
log.Println(err) |
||||||
|
} |
||||||
|
|
||||||
|
totalRead += n |
||||||
|
buf = append(buf, innerBuf[:n]...) |
||||||
|
|
||||||
|
if totalRead < 3 { |
||||||
|
continue |
||||||
|
} |
||||||
|
if int(buf[2]) != len(buf)-4 { |
||||||
|
continue |
||||||
|
} |
||||||
|
break |
||||||
|
|
||||||
|
} |
||||||
|
if buf[0] != 0xAA || buf[1] != 0xBB { |
||||||
|
log.Println("shit happens") |
||||||
|
} |
||||||
|
|
||||||
|
return buf |
||||||
|
} |
||||||
|
func sendRequest(port *serial.Port, commandCode int16, bytesData []byte) { |
||||||
|
buf := new(bytes.Buffer) |
||||||
|
|
||||||
|
ver := byte(0x00) |
||||||
|
length := len(bytesData) + 5 |
||||||
|
|
||||||
|
binary.Write(buf, binary.BigEndian, byte(0xAA)) |
||||||
|
binary.Write(buf, binary.BigEndian, byte(0xBB)) |
||||||
|
binary.Write(buf, binary.BigEndian, byte(length)) |
||||||
|
binary.Write(buf, binary.BigEndian, byte(0x00)) |
||||||
|
binary.Write(buf, binary.BigEndian, int16(0)) // device id
|
||||||
|
binary.Write(buf, binary.BigEndian, commandCode) |
||||||
|
binary.Write(buf, binary.BigEndian, bytesData) |
||||||
|
|
||||||
|
for _, k := range buf.Bytes()[3:] { |
||||||
|
ver = ver ^ k |
||||||
|
} |
||||||
|
binary.Write(buf, binary.BigEndian, ver) |
||||||
|
|
||||||
|
log.Println(buf.Bytes()) |
||||||
|
|
||||||
|
port.Write(buf.Bytes()) |
||||||
|
} |
Loading…
Reference in new issue