feat: verify responses, return only response data

master
Damanox 7 years ago
parent c4f08e7c4d
commit eb69b57a5b
  1. 55
      sl500.go

@ -1,25 +1,26 @@
package sl500_api package sl500_api
import ( import (
"github.com/tarm/serial" "bytes"
"encoding/binary"
"fmt" "fmt"
"log" "log"
"encoding/binary"
"bytes"
"time" "time"
"github.com/tarm/serial"
) )
var Baud = baudRegistry() var Baud = baudRegistry()
func baudRegistry() *baudList { func baudRegistry() *baudList {
return &baudList{ return &baudList{
Baud4800: baud{0, 4800}, Baud4800: baud{0, 4800},
Baud9600: baud{1, 9600}, Baud9600: baud{1, 9600},
Baud14400: baud{2, 14400}, Baud14400: baud{2, 14400},
Baud19200: baud{3, 19200}, Baud19200: baud{3, 19200},
Baud28800: baud{4, 28800}, Baud28800: baud{4, 28800},
Baud38400: baud{5, 38400}, Baud38400: baud{5, 38400},
Baud57600: baud{6, 57600}, Baud57600: baud{6, 57600},
Baud115200: baud{7, 115200}, Baud115200: baud{7, 115200},
} }
} }
@ -33,13 +34,13 @@ const (
) )
type baudList struct { type baudList struct {
Baud4800 baud Baud4800 baud
Baud9600 baud Baud9600 baud
Baud14400 baud Baud14400 baud
Baud19200 baud Baud19200 baud
Baud28800 baud Baud28800 baud
Baud38400 baud Baud38400 baud
Baud57600 baud Baud57600 baud
Baud115200 baud Baud115200 baud
} }
@ -98,18 +99,22 @@ 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, error) { 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) ([]byte, error) { func (s *Sl500) RfInitType(workType byte) ([]byte, error) {
sendRequest(s.port, 0x0801, []byte{workType}) sendRequest(s.port, 0x0801, []byte{workType})
return readResponse(s.port) return readResponse(s.port)
} }
func (s *Sl500) RfBeep(durationMs byte) ([]byte, error) { func (s *Sl500) RfBeep(durationMs byte) ([]byte, error) {
sendRequest(s.port, 0x0601, []byte{durationMs}) sendRequest(s.port, 0x0601, []byte{durationMs})
return readResponse(s.port) return readResponse(s.port)
} }
func readResponse(port *serial.Port) ([]byte, error) { func readResponse(port *serial.Port) ([]byte, error) {
var buf []byte var buf []byte
innerBuf := make([]byte, 128) innerBuf := make([]byte, 128)
@ -140,15 +145,27 @@ func readResponse(port *serial.Port) ([]byte, error) {
if int(buf[2]) != len(buf)-4 { if int(buf[2]) != len(buf)-4 {
continue continue
} }
break
break
} }
if buf[0] != 0xAA || buf[1] != 0xBB { if buf[0] != 0xAA || buf[1] != 0xBB {
return nil, fmt.Errorf("Response format invalid") return nil, fmt.Errorf("Response format invalid")
} }
return buf, nil buf = buf[3:]
ver := byte(0x00)
for _, k := range buf[:len(buf)-1] {
ver = ver ^ k
}
if ver != buf[len(buf)-1] {
return nil, fmt.Errorf("Response verification failed")
}
return buf[3 : len(buf)-1], 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