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

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