mirror of
https://github.com/MengMengCode/VoCat.git
synced 2026-08-13 03:13:43 +08:00
48 lines
989 B
Go
48 lines
989 B
Go
package modem
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"go.bug.st/serial"
|
|
)
|
|
|
|
type SerialOpener struct {
|
|
SessionOptions SessionOptions
|
|
BaudRate int
|
|
}
|
|
|
|
func (opener SerialOpener) Open(ctx context.Context, port Port) (Client, error) {
|
|
if err := ctx.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
path := port.OpenPath()
|
|
if path == "" {
|
|
return nil, errors.New("modem: candidate has no AT port")
|
|
}
|
|
baudRate := opener.BaudRate
|
|
if baudRate <= 0 {
|
|
baudRate = 115200
|
|
}
|
|
rawPort, err := serial.Open(path, &serial.Mode{
|
|
BaudRate: baudRate,
|
|
DataBits: 8,
|
|
Parity: serial.NoParity,
|
|
StopBits: serial.OneStopBit,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("open AT port %s: %w", path, err)
|
|
}
|
|
if err := rawPort.ResetInputBuffer(); err != nil {
|
|
_ = rawPort.Close()
|
|
return nil, fmt.Errorf("reset AT input buffer %s: %w", path, err)
|
|
}
|
|
session, err := NewSession(rawPort, opener.SessionOptions)
|
|
if err != nil {
|
|
_ = rawPort.Close()
|
|
return nil, err
|
|
}
|
|
return session, nil
|
|
}
|