126 lines
3.1 KiB
Go
126 lines
3.1 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/trzsz/trzsz-go/trzsz"
|
||
|
"go.bug.st/serial"
|
||
|
"golang.org/x/term"
|
||
|
"io"
|
||
|
"log"
|
||
|
"net"
|
||
|
"os"
|
||
|
"os/signal"
|
||
|
"runtime"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func checkPortAvailability(name string) ([]string, error) {
|
||
|
ports, err := serial.GetPortsList()
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
if len(ports) == 0 {
|
||
|
return nil, fmt.Errorf("无串口")
|
||
|
}
|
||
|
if name == "" {
|
||
|
return ports, fmt.Errorf("串口未指定")
|
||
|
}
|
||
|
for _, port := range ports {
|
||
|
if strings.Compare(port, name) == 0 {
|
||
|
return ports, nil
|
||
|
}
|
||
|
}
|
||
|
return ports, fmt.Errorf("串口 " + name + " 未在线")
|
||
|
}
|
||
|
|
||
|
func OpenSerial() {
|
||
|
var err error
|
||
|
mode := &serial.Mode{
|
||
|
BaudRate: config.baudRate,
|
||
|
StopBits: serial.StopBits(config.stopBits),
|
||
|
DataBits: config.dataBits,
|
||
|
Parity: serial.Parity(config.parityBit),
|
||
|
}
|
||
|
serialPort, err = serial.Open(config.portName, mode)
|
||
|
ErrorF(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func CloseSerial() {
|
||
|
err := serialPort.Close()
|
||
|
ErrorF(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var termch chan os.Signal
|
||
|
|
||
|
// OpenTrzsz create a TrzszFilter to support trzsz ( trz / tsz ).
|
||
|
//
|
||
|
// ┌────────┐ stdinPipe ┌────────┐ ClientIn ┌─────────────┐ SerialIn ┌────────┐
|
||
|
// │ ├─────────────►│ ├─────────────►│ ├─────────────►│ │
|
||
|
// │ mutual │ │ Client │ │ TrzszFilter │ │ Serial │
|
||
|
// │ │◄─────────────│ │◄─────────────┤ │◄─────────────┤ │
|
||
|
// └────────┘ stdoutPipe └────────┘ ClientOut └─────────────┘ SerialOut └────────┘
|
||
|
func OpenTrzsz() {
|
||
|
fd := int(os.Stdin.Fd())
|
||
|
width, _, err := term.GetSize(fd)
|
||
|
if err != nil {
|
||
|
if runtime.GOOS != "windows" {
|
||
|
fmt.Printf("term get size failed: %s\n", err)
|
||
|
return
|
||
|
}
|
||
|
width = 80
|
||
|
}
|
||
|
|
||
|
clientIn, stdinPipe = io.Pipe()
|
||
|
stdoutPipe, clientOut = io.Pipe()
|
||
|
trzszFilter = trzsz.NewTrzszFilter(clientIn, clientOut, serialPort, serialPort,
|
||
|
trzsz.TrzszOptions{TerminalColumns: int32(width), EnableZmodem: true})
|
||
|
trzsz.SetAffectedByWindows(false)
|
||
|
termch = make(chan os.Signal, 1)
|
||
|
go func() {
|
||
|
for range termch {
|
||
|
width, _, err := term.GetSize(fd)
|
||
|
if err != nil {
|
||
|
fmt.Printf("term get size failed: %s\n", err)
|
||
|
continue
|
||
|
}
|
||
|
trzszFilter.SetTerminalColumns(int32(width))
|
||
|
}
|
||
|
}()
|
||
|
}
|
||
|
|
||
|
func CloseTrzsz() {
|
||
|
signal.Stop(termch)
|
||
|
close(termch)
|
||
|
}
|
||
|
|
||
|
func OpenForwarding() {
|
||
|
for i, mode := range config.forWard {
|
||
|
if FoeWardMode(mode) != NOT {
|
||
|
conn := setForWardClient(FoeWardMode(mode), config.address[i])
|
||
|
outs = append(outs, conn)
|
||
|
go func() {
|
||
|
defer func(conn net.Conn) {
|
||
|
err := conn.Close()
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}(conn)
|
||
|
input(conn)
|
||
|
}()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func ErrorP(err error) {
|
||
|
if err != nil {
|
||
|
fmt.Fprint(os.Stderr, err)
|
||
|
}
|
||
|
}
|
||
|
func ErrorF(err error) {
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|