You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.2 KiB
40 lines
1.2 KiB
//go:build linux
|
|
|
|
package serial
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func platformModemLinkState(entry MappingChannel) LinkState {
|
|
if entry.LinkSignal == "unknown" {
|
|
return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: "physical modem link signal is not board-validated"}
|
|
}
|
|
fd, err := unix.Open(entry.Device, unix.O_RDWR|unix.O_NOCTTY|unix.O_NONBLOCK|unix.O_CLOEXEC, 0)
|
|
if err != nil {
|
|
return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: "serial device cannot be opened for modem status"}
|
|
}
|
|
defer unix.Close(fd)
|
|
bits, err := unix.IoctlGetInt(fd, unix.TIOCMGET)
|
|
if err != nil {
|
|
return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: fmt.Sprintf("%s modem status is unavailable", entry.LinkSignal)}
|
|
}
|
|
var mask int
|
|
switch entry.LinkSignal {
|
|
case "dcd":
|
|
mask = unix.TIOCM_CAR
|
|
case "dsr":
|
|
mask = unix.TIOCM_DSR
|
|
case "cts":
|
|
mask = unix.TIOCM_CTS
|
|
default:
|
|
return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: "unsupported modem link signal"}
|
|
}
|
|
state := "down"
|
|
if bits&mask != 0 {
|
|
state = "up"
|
|
}
|
|
return LinkState{Channel: entry.Channel, State: state, Signal: entry.LinkSignal, Available: true}
|
|
}
|
|
|