| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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
- }
|