-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprofile.go
55 lines (46 loc) · 1.87 KB
/
profile.go
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
package at
import (
"bytes"
)
// DefaultProfile is implementation of AT device profile (at.DeviceProfile)
type DefaultProfile struct{}
var _ DeviceProfile = DefaultProfile{}
func (p DefaultProfile) EOLSequence() []byte { return []byte("\r\n") }
func (p DefaultProfile) PromptSequence() []byte { return []byte(">") }
func (p DefaultProfile) Hooks() DeviceHooks { return p }
func (p DefaultProfile) InferState(readData []byte, lastCmd []byte, outputCountCmd int) (State, error) {
switch {
case len(readData) == 0:
return ATReady, nil
case bytes.Equal(readData, append([]byte("OK"), p.EOLSequence()...)):
return ATReady, nil
case bytes.Equal(readData, append([]byte("BUSY"), p.EOLSequence()...)):
// BUSY is returned on ATD calls. Doesn't seem right to call it an error, so.
return ATReady, nil
case bytes.HasPrefix(readData, []byte("+CME ERROR:")), bytes.HasPrefix(readData, []byte("+CMS ERROR:")),
bytes.HasPrefix(readData, []byte("ERROR")), bytes.HasPrefix(readData, []byte("COMMAND NOT SUPPORT")),
bytes.HasPrefix(readData, append([]byte("TOO MANY PARAMETERS"), p.EOLSequence()...)), bytes.HasPrefix(readData, append([]byte("NO CARRIER"))):
return ATError, nil
case bytes.HasSuffix(readData, p.PromptSequence()):
return ATPrompt, nil
case len(lastCmd) != 0 &&
bytes.Equal(readData, lastCmd) &&
outputCountCmd == 1:
return ATEcho, nil
case len(lastCmd) == 0 && outputCountCmd == 0:
// Output with no command sent / active? Must be notice from the network
return ATNotice, nil
default:
return ATData, nil
}
}
var _ DeviceHooks = DefaultProfile{}
func (p DefaultProfile) OutputTokenizer(readData []byte) (advance int, token []byte, matched bool) {
return 0, readData, false
}
func (p DefaultProfile) Output(readData []byte, lastCmd []byte, outputCountCmd int) []byte {
return readData
}
func (p DefaultProfile) Input(readData []byte) []byte {
return readData
}