diff options
Diffstat (limited to 'vendor/github.com/tarm/serial')
-rw-r--r-- | vendor/github.com/tarm/serial/.travis.yml | 14 | ||||
-rw-r--r-- | vendor/github.com/tarm/serial/LICENSE | 27 | ||||
-rw-r--r-- | vendor/github.com/tarm/serial/README.md | 82 | ||||
-rw-r--r-- | vendor/github.com/tarm/serial/serial.go | 167 | ||||
-rw-r--r-- | vendor/github.com/tarm/serial/serial_linux.go | 164 | ||||
-rw-r--r-- | vendor/github.com/tarm/serial/serial_posix.go | 197 | ||||
-rw-r--r-- | vendor/github.com/tarm/serial/serial_windows.go | 327 |
7 files changed, 0 insertions, 978 deletions
diff --git a/vendor/github.com/tarm/serial/.travis.yml b/vendor/github.com/tarm/serial/.travis.yml deleted file mode 100644 index 28d22ca..0000000 --- a/vendor/github.com/tarm/serial/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: false -language: go -go: - - "1.9" - - "1.10" - - "1.11" - - tip -env: - - GOOS=linux CGO=1 - - GOOS=linux CGO=0 - - GOOS=linux GOARCH=arm - - GOOS=linux GOARCH=mips - - GOOS=linux GOARCH=mipsle - - GOOS=windows GOARCH=386 diff --git a/vendor/github.com/tarm/serial/LICENSE b/vendor/github.com/tarm/serial/LICENSE deleted file mode 100644 index 6a66aea..0000000 --- a/vendor/github.com/tarm/serial/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/tarm/serial/README.md b/vendor/github.com/tarm/serial/README.md deleted file mode 100644 index d2fa899..0000000 --- a/vendor/github.com/tarm/serial/README.md +++ /dev/null @@ -1,82 +0,0 @@ -[![GoDoc](https://godoc.org/github.com/tarm/serial?status.svg)](http://godoc.org/github.com/tarm/serial) -[![Build Status](https://travis-ci.org/tarm/serial.svg?branch=master)](https://travis-ci.org/tarm/serial) - -Serial -======== -A Go package to allow you to read and write from the -serial port as a stream of bytes. - -Details -------- -It aims to have the same API on all platforms, including windows. As -an added bonus, the windows package does not use cgo, so you can cross -compile for windows from another platform. - -You can cross compile with - GOOS=windows GOARCH=386 go install github.com/tarm/serial - -Currently there is very little in the way of configurability. You can -set the baud rate. Then you can Read(), Write(), or Close() the -connection. By default Read() will block until at least one byte is -returned. Write is the same. - -Currently all ports are opened with 8 data bits, 1 stop bit, no -parity, no hardware flow control, and no software flow control. This -works fine for many real devices and many faux serial devices -including usb-to-serial converters and bluetooth serial ports. - -You may Read() and Write() simulantiously on the same connection (from -different goroutines). - -Usage ------ -```go -package main - -import ( - "log" - - "github.com/tarm/serial" -) - -func main() { - c := &serial.Config{Name: "COM45", Baud: 115200} - s, err := serial.OpenPort(c) - if err != nil { - log.Fatal(err) - } - - n, err := s.Write([]byte("test")) - if err != nil { - log.Fatal(err) - } - - buf := make([]byte, 128) - n, err = s.Read(buf) - if err != nil { - log.Fatal(err) - } - log.Printf("%q", buf[:n]) -} -``` - -NonBlocking Mode ----------------- -By default the returned Port reads in blocking mode. Which means -`Read()` will block until at least one byte is returned. If that's not -what you want, specify a positive ReadTimeout and the Read() will -timeout returning 0 bytes if no bytes are read. Please note that this -is the total timeout the read operation will wait and not the interval -timeout between two bytes. - -```go - c := &serial.Config{Name: "COM45", Baud: 115200, ReadTimeout: time.Second * 5} - - // In this mode, you will want to suppress error for read - // as 0 bytes return EOF error on Linux / POSIX - n, _ = s.Read(buf) -``` - -Possible Future Work --------------------- -- better tests (loopback etc) diff --git a/vendor/github.com/tarm/serial/serial.go b/vendor/github.com/tarm/serial/serial.go deleted file mode 100644 index f61ea28..0000000 --- a/vendor/github.com/tarm/serial/serial.go +++ /dev/null @@ -1,167 +0,0 @@ -/* -Goserial is a simple go package to allow you to read and write from -the serial port as a stream of bytes. - -It aims to have the same API on all platforms, including windows. As -an added bonus, the windows package does not use cgo, so you can cross -compile for windows from another platform. Unfortunately goinstall -does not currently let you cross compile so you will have to do it -manually: - - GOOS=windows make clean install - -Currently there is very little in the way of configurability. You can -set the baud rate. Then you can Read(), Write(), or Close() the -connection. Read() will block until at least one byte is returned. -Write is the same. There is currently no exposed way to set the -timeouts, though patches are welcome. - -Currently all ports are opened with 8 data bits, 1 stop bit, no -parity, no hardware flow control, and no software flow control. This -works fine for many real devices and many faux serial devices -including usb-to-serial converters and bluetooth serial ports. - -You may Read() and Write() simulantiously on the same connection (from -different goroutines). - -Example usage: - - package main - - import ( - "github.com/tarm/serial" - "log" - ) - - func main() { - c := &serial.Config{Name: "COM5", Baud: 115200} - s, err := serial.OpenPort(c) - if err != nil { - log.Fatal(err) - } - - n, err := s.Write([]byte("test")) - if err != nil { - log.Fatal(err) - } - - buf := make([]byte, 128) - n, err = s.Read(buf) - if err != nil { - log.Fatal(err) - } - log.Print("%q", buf[:n]) - } -*/ -package serial - -import ( - "errors" - "time" -) - -const DefaultSize = 8 // Default value for Config.Size - -type StopBits byte -type Parity byte - -const ( - Stop1 StopBits = 1 - Stop1Half StopBits = 15 - Stop2 StopBits = 2 -) - -const ( - ParityNone Parity = 'N' - ParityOdd Parity = 'O' - ParityEven Parity = 'E' - ParityMark Parity = 'M' // parity bit is always 1 - ParitySpace Parity = 'S' // parity bit is always 0 -) - -// Config contains the information needed to open a serial port. -// -// Currently few options are implemented, but more may be added in the -// future (patches welcome), so it is recommended that you create a -// new config addressing the fields by name rather than by order. -// -// For example: -// -// c0 := &serial.Config{Name: "COM45", Baud: 115200, ReadTimeout: time.Millisecond * 500} -// or -// c1 := new(serial.Config) -// c1.Name = "/dev/tty.usbserial" -// c1.Baud = 115200 -// c1.ReadTimeout = time.Millisecond * 500 -// -type Config struct { - Name string - Baud int - ReadTimeout time.Duration // Total timeout - - // Size is the number of data bits. If 0, DefaultSize is used. - Size byte - - // Parity is the bit to use and defaults to ParityNone (no parity bit). - Parity Parity - - // Number of stop bits to use. Default is 1 (1 stop bit). - StopBits StopBits - - // RTSFlowControl bool - // DTRFlowControl bool - // XONFlowControl bool - - // CRLFTranslate bool -} - -// ErrBadSize is returned if Size is not supported. -var ErrBadSize error = errors.New("unsupported serial data size") - -// ErrBadStopBits is returned if the specified StopBits setting not supported. -var ErrBadStopBits error = errors.New("unsupported stop bit setting") - -// ErrBadParity is returned if the parity is not supported. -var ErrBadParity error = errors.New("unsupported parity setting") - -// OpenPort opens a serial port with the specified configuration -func OpenPort(c *Config) (*Port, error) { - size, par, stop := c.Size, c.Parity, c.StopBits - if size == 0 { - size = DefaultSize - } - if par == 0 { - par = ParityNone - } - if stop == 0 { - stop = Stop1 - } - return openPort(c.Name, c.Baud, size, par, stop, c.ReadTimeout) -} - -// Converts the timeout values for Linux / POSIX systems -func posixTimeoutValues(readTimeout time.Duration) (vmin uint8, vtime uint8) { - const MAXUINT8 = 1<<8 - 1 // 255 - // set blocking / non-blocking read - var minBytesToRead uint8 = 1 - var readTimeoutInDeci int64 - if readTimeout > 0 { - // EOF on zero read - minBytesToRead = 0 - // convert timeout to deciseconds as expected by VTIME - readTimeoutInDeci = (readTimeout.Nanoseconds() / 1e6 / 100) - // capping the timeout - if readTimeoutInDeci < 1 { - // min possible timeout 1 Deciseconds (0.1s) - readTimeoutInDeci = 1 - } else if readTimeoutInDeci > MAXUINT8 { - // max possible timeout is 255 deciseconds (25.5s) - readTimeoutInDeci = MAXUINT8 - } - } - return minBytesToRead, uint8(readTimeoutInDeci) -} - -// func SendBreak() - -// func RegisterBreakHandler(func()) diff --git a/vendor/github.com/tarm/serial/serial_linux.go b/vendor/github.com/tarm/serial/serial_linux.go deleted file mode 100644 index 65420f3..0000000 --- a/vendor/github.com/tarm/serial/serial_linux.go +++ /dev/null @@ -1,164 +0,0 @@ -// +build linux - -package serial - -import ( - "fmt" - "os" - "time" - "unsafe" - - "golang.org/x/sys/unix" -) - -func openPort(name string, baud int, databits byte, parity Parity, stopbits StopBits, readTimeout time.Duration) (p *Port, err error) { - var bauds = map[int]uint32{ - 50: unix.B50, - 75: unix.B75, - 110: unix.B110, - 134: unix.B134, - 150: unix.B150, - 200: unix.B200, - 300: unix.B300, - 600: unix.B600, - 1200: unix.B1200, - 1800: unix.B1800, - 2400: unix.B2400, - 4800: unix.B4800, - 9600: unix.B9600, - 19200: unix.B19200, - 38400: unix.B38400, - 57600: unix.B57600, - 115200: unix.B115200, - 230400: unix.B230400, - 460800: unix.B460800, - 500000: unix.B500000, - 576000: unix.B576000, - 921600: unix.B921600, - 1000000: unix.B1000000, - 1152000: unix.B1152000, - 1500000: unix.B1500000, - 2000000: unix.B2000000, - 2500000: unix.B2500000, - 3000000: unix.B3000000, - 3500000: unix.B3500000, - 4000000: unix.B4000000, - } - - rate, ok := bauds[baud] - - if !ok { - return nil, fmt.Errorf("Unrecognized baud rate") - } - - f, err := os.OpenFile(name, unix.O_RDWR|unix.O_NOCTTY|unix.O_NONBLOCK, 0666) - if err != nil { - return nil, err - } - - defer func() { - if err != nil && f != nil { - f.Close() - } - }() - - // Base settings - cflagToUse := unix.CREAD | unix.CLOCAL | rate - switch databits { - case 5: - cflagToUse |= unix.CS5 - case 6: - cflagToUse |= unix.CS6 - case 7: - cflagToUse |= unix.CS7 - case 8: - cflagToUse |= unix.CS8 - default: - return nil, ErrBadSize - } - // Stop bits settings - switch stopbits { - case Stop1: - // default is 1 stop bit - case Stop2: - cflagToUse |= unix.CSTOPB - default: - // Don't know how to set 1.5 - return nil, ErrBadStopBits - } - // Parity settings - switch parity { - case ParityNone: - // default is no parity - case ParityOdd: - cflagToUse |= unix.PARENB - cflagToUse |= unix.PARODD - case ParityEven: - cflagToUse |= unix.PARENB - default: - return nil, ErrBadParity - } - fd := f.Fd() - vmin, vtime := posixTimeoutValues(readTimeout) - t := unix.Termios{ - Iflag: unix.IGNPAR, - Cflag: cflagToUse, - Ispeed: rate, - Ospeed: rate, - } - t.Cc[unix.VMIN] = vmin - t.Cc[unix.VTIME] = vtime - - if _, _, errno := unix.Syscall6( - unix.SYS_IOCTL, - uintptr(fd), - uintptr(unix.TCSETS), - uintptr(unsafe.Pointer(&t)), - 0, - 0, - 0, - ); errno != 0 { - return nil, errno - } - - if err = unix.SetNonblock(int(fd), false); err != nil { - return - } - - return &Port{f: f}, nil -} - -type Port struct { - // We intentionly do not use an "embedded" struct so that we - // don't export File - f *os.File -} - -func (p *Port) Read(b []byte) (n int, err error) { - return p.f.Read(b) -} - -func (p *Port) Write(b []byte) (n int, err error) { - return p.f.Write(b) -} - -// Discards data written to the port but not transmitted, -// or data received but not read -func (p *Port) Flush() error { - const TCFLSH = 0x540B - _, _, errno := unix.Syscall( - unix.SYS_IOCTL, - uintptr(p.f.Fd()), - uintptr(TCFLSH), - uintptr(unix.TCIOFLUSH), - ) - - if errno == 0 { - return nil - } - return errno -} - -func (p *Port) Close() (err error) { - return p.f.Close() -} diff --git a/vendor/github.com/tarm/serial/serial_posix.go b/vendor/github.com/tarm/serial/serial_posix.go deleted file mode 100644 index d733f0f..0000000 --- a/vendor/github.com/tarm/serial/serial_posix.go +++ /dev/null @@ -1,197 +0,0 @@ -// +build !windows,!linux,cgo - -package serial - -// #include <termios.h> -// #include <unistd.h> -import "C" - -// TODO: Maybe change to using syscall package + ioctl instead of cgo - -import ( - "errors" - "fmt" - "os" - "syscall" - "time" - //"unsafe" -) - -func openPort(name string, baud int, databits byte, parity Parity, stopbits StopBits, readTimeout time.Duration) (p *Port, err error) { - f, err := os.OpenFile(name, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NONBLOCK, 0666) - if err != nil { - return - } - - fd := C.int(f.Fd()) - if C.isatty(fd) != 1 { - f.Close() - return nil, errors.New("File is not a tty") - } - - var st C.struct_termios - _, err = C.tcgetattr(fd, &st) - if err != nil { - f.Close() - return nil, err - } - var speed C.speed_t - switch baud { - case 115200: - speed = C.B115200 - case 57600: - speed = C.B57600 - case 38400: - speed = C.B38400 - case 19200: - speed = C.B19200 - case 9600: - speed = C.B9600 - case 4800: - speed = C.B4800 - case 2400: - speed = C.B2400 - case 1200: - speed = C.B1200 - case 600: - speed = C.B600 - case 300: - speed = C.B300 - case 200: - speed = C.B200 - case 150: - speed = C.B150 - case 134: - speed = C.B134 - case 110: - speed = C.B110 - case 75: - speed = C.B75 - case 50: - speed = C.B50 - default: - f.Close() - return nil, fmt.Errorf("Unknown baud rate %v", baud) - } - - _, err = C.cfsetispeed(&st, speed) - if err != nil { - f.Close() - return nil, err - } - _, err = C.cfsetospeed(&st, speed) - if err != nil { - f.Close() - return nil, err - } - - // Turn off break interrupts, CR->NL, Parity checks, strip, and IXON - st.c_iflag &= ^C.tcflag_t(C.BRKINT | C.ICRNL | C.INPCK | C.ISTRIP | C.IXOFF | C.IXON | C.PARMRK) - - // Select local mode, turn off parity, set to 8 bits - st.c_cflag &= ^C.tcflag_t(C.CSIZE | C.PARENB) - st.c_cflag |= (C.CLOCAL | C.CREAD) - // databits - switch databits { - case 5: - st.c_cflag |= C.CS5 - case 6: - st.c_cflag |= C.CS6 - case 7: - st.c_cflag |= C.CS7 - case 8: - st.c_cflag |= C.CS8 - default: - return nil, ErrBadSize - } - // Parity settings - switch parity { - case ParityNone: - // default is no parity - case ParityOdd: - st.c_cflag |= C.PARENB - st.c_cflag |= C.PARODD - case ParityEven: - st.c_cflag |= C.PARENB - st.c_cflag &= ^C.tcflag_t(C.PARODD) - default: - return nil, ErrBadParity - } - // Stop bits settings - switch stopbits { - case Stop1: - // as is, default is 1 bit - case Stop2: - st.c_cflag |= C.CSTOPB - default: - return nil, ErrBadStopBits - } - // Select raw mode - st.c_lflag &= ^C.tcflag_t(C.ICANON | C.ECHO | C.ECHOE | C.ISIG) - st.c_oflag &= ^C.tcflag_t(C.OPOST) - - // set blocking / non-blocking read - /* - * http://man7.org/linux/man-pages/man3/termios.3.html - * - Supports blocking read and read with timeout operations - */ - vmin, vtime := posixTimeoutValues(readTimeout) - st.c_cc[C.VMIN] = C.cc_t(vmin) - st.c_cc[C.VTIME] = C.cc_t(vtime) - - _, err = C.tcsetattr(fd, C.TCSANOW, &st) - if err != nil { - f.Close() - return nil, err - } - - //fmt.Println("Tweaking", name) - r1, _, e := syscall.Syscall(syscall.SYS_FCNTL, - uintptr(f.Fd()), - uintptr(syscall.F_SETFL), - uintptr(0)) - if e != 0 || r1 != 0 { - s := fmt.Sprint("Clearing NONBLOCK syscall error:", e, r1) - f.Close() - return nil, errors.New(s) - } - - /* - r1, _, e = syscall.Syscall(syscall.SYS_IOCTL, - uintptr(f.Fd()), - uintptr(0x80045402), // IOSSIOSPEED - uintptr(unsafe.Pointer(&baud))); - if e != 0 || r1 != 0 { - s := fmt.Sprint("Baudrate syscall error:", e, r1) - f.Close() - return nil, os.NewError(s) - } - */ - - return &Port{f: f}, nil -} - -type Port struct { - // We intentionly do not use an "embedded" struct so that we - // don't export File - f *os.File -} - -func (p *Port) Read(b []byte) (n int, err error) { - return p.f.Read(b) -} - -func (p *Port) Write(b []byte) (n int, err error) { - return p.f.Write(b) -} - -// Discards data written to the port but not transmitted, -// or data received but not read -func (p *Port) Flush() error { - _, err := C.tcflush(C.int(p.f.Fd()), C.TCIOFLUSH) - return err -} - -func (p *Port) Close() (err error) { - return p.f.Close() -} diff --git a/vendor/github.com/tarm/serial/serial_windows.go b/vendor/github.com/tarm/serial/serial_windows.go deleted file mode 100644 index 2a9c004..0000000 --- a/vendor/github.com/tarm/serial/serial_windows.go +++ /dev/null @@ -1,327 +0,0 @@ -// +build windows - -package serial - -import ( - "fmt" - "os" - "sync" - "syscall" - "time" - "unsafe" -) - -type Port struct { - f *os.File - fd syscall.Handle - rl sync.Mutex - wl sync.Mutex - ro *syscall.Overlapped - wo *syscall.Overlapped -} - -type structDCB struct { - DCBlength, BaudRate uint32 - flags [4]byte - wReserved, XonLim, XoffLim uint16 - ByteSize, Parity, StopBits byte - XonChar, XoffChar, ErrorChar, EofChar, EvtChar byte - wReserved1 uint16 -} - -type structTimeouts struct { - ReadIntervalTimeout uint32 - ReadTotalTimeoutMultiplier uint32 - ReadTotalTimeoutConstant uint32 - WriteTotalTimeoutMultiplier uint32 - WriteTotalTimeoutConstant uint32 -} - -func openPort(name string, baud int, databits byte, parity Parity, stopbits StopBits, readTimeout time.Duration) (p *Port, err error) { - if len(name) > 0 && name[0] != '\\' { - name = "\\\\.\\" + name - } - - h, err := syscall.CreateFile(syscall.StringToUTF16Ptr(name), - syscall.GENERIC_READ|syscall.GENERIC_WRITE, - 0, - nil, - syscall.OPEN_EXISTING, - syscall.FILE_ATTRIBUTE_NORMAL|syscall.FILE_FLAG_OVERLAPPED, - 0) - if err != nil { - return nil, err - } - f := os.NewFile(uintptr(h), name) - defer func() { - if err != nil { - f.Close() - } - }() - - if err = setCommState(h, baud, databits, parity, stopbits); err != nil { - return nil, err - } - if err = setupComm(h, 64, 64); err != nil { - return nil, err - } - if err = setCommTimeouts(h, readTimeout); err != nil { - return nil, err - } - if err = setCommMask(h); err != nil { - return nil, err - } - - ro, err := newOverlapped() - if err != nil { - return nil, err - } - wo, err := newOverlapped() - if err != nil { - return nil, err - } - port := new(Port) - port.f = f - port.fd = h - port.ro = ro - port.wo = wo - - return port, nil -} - -func (p *Port) Close() error { - return p.f.Close() -} - -func (p *Port) Write(buf []byte) (int, error) { - p.wl.Lock() - defer p.wl.Unlock() - - if err := resetEvent(p.wo.HEvent); err != nil { - return 0, err - } - var n uint32 - err := syscall.WriteFile(p.fd, buf, &n, p.wo) - if err != nil && err != syscall.ERROR_IO_PENDING { - return int(n), err - } - return getOverlappedResult(p.fd, p.wo) -} - -func (p *Port) Read(buf []byte) (int, error) { - if p == nil || p.f == nil { - return 0, fmt.Errorf("Invalid port on read") - } - - p.rl.Lock() - defer p.rl.Unlock() - - if err := resetEvent(p.ro.HEvent); err != nil { - return 0, err - } - var done uint32 - err := syscall.ReadFile(p.fd, buf, &done, p.ro) - if err != nil && err != syscall.ERROR_IO_PENDING { - return int(done), err - } - return getOverlappedResult(p.fd, p.ro) -} - -// Discards data written to the port but not transmitted, -// or data received but not read -func (p *Port) Flush() error { - return purgeComm(p.fd) -} - -var ( - nSetCommState, - nSetCommTimeouts, - nSetCommMask, - nSetupComm, - nGetOverlappedResult, - nCreateEvent, - nResetEvent, - nPurgeComm, - nFlushFileBuffers uintptr -) - -func init() { - k32, err := syscall.LoadLibrary("kernel32.dll") - if err != nil { - panic("LoadLibrary " + err.Error()) - } - defer syscall.FreeLibrary(k32) - - nSetCommState = getProcAddr(k32, "SetCommState") - nSetCommTimeouts = getProcAddr(k32, "SetCommTimeouts") - nSetCommMask = getProcAddr(k32, "SetCommMask") - nSetupComm = getProcAddr(k32, "SetupComm") - nGetOverlappedResult = getProcAddr(k32, "GetOverlappedResult") - nCreateEvent = getProcAddr(k32, "CreateEventW") - nResetEvent = getProcAddr(k32, "ResetEvent") - nPurgeComm = getProcAddr(k32, "PurgeComm") - nFlushFileBuffers = getProcAddr(k32, "FlushFileBuffers") -} - -func getProcAddr(lib syscall.Handle, name string) uintptr { - addr, err := syscall.GetProcAddress(lib, name) - if err != nil { - panic(name + " " + err.Error()) - } - return addr -} - -func setCommState(h syscall.Handle, baud int, databits byte, parity Parity, stopbits StopBits) error { - var params structDCB - params.DCBlength = uint32(unsafe.Sizeof(params)) - - params.flags[0] = 0x01 // fBinary - params.flags[0] |= 0x10 // Assert DSR - - params.BaudRate = uint32(baud) - - params.ByteSize = databits - - switch parity { - case ParityNone: - params.Parity = 0 - case ParityOdd: - params.Parity = 1 - case ParityEven: - params.Parity = 2 - case ParityMark: - params.Parity = 3 - case ParitySpace: - params.Parity = 4 - default: - return ErrBadParity - } - - switch stopbits { - case Stop1: - params.StopBits = 0 - case Stop1Half: - params.StopBits = 1 - case Stop2: - params.StopBits = 2 - default: - return ErrBadStopBits - } - - r, _, err := syscall.Syscall(nSetCommState, 2, uintptr(h), uintptr(unsafe.Pointer(¶ms)), 0) - if r == 0 { - return err - } - return nil -} - -func setCommTimeouts(h syscall.Handle, readTimeout time.Duration) error { - var timeouts structTimeouts - const MAXDWORD = 1<<32 - 1 - - // blocking read by default - var timeoutMs int64 = MAXDWORD - 1 - - if readTimeout > 0 { - // non-blocking read - timeoutMs = readTimeout.Nanoseconds() / 1e6 - if timeoutMs < 1 { - timeoutMs = 1 - } else if timeoutMs > MAXDWORD-1 { - timeoutMs = MAXDWORD - 1 - } - } - - /* From http://msdn.microsoft.com/en-us/library/aa363190(v=VS.85).aspx - - For blocking I/O see below: - - Remarks: - - If an application sets ReadIntervalTimeout and - ReadTotalTimeoutMultiplier to MAXDWORD and sets - ReadTotalTimeoutConstant to a value greater than zero and - less than MAXDWORD, one of the following occurs when the - ReadFile function is called: - - If there are any bytes in the input buffer, ReadFile returns - immediately with the bytes in the buffer. - - If there are no bytes in the input buffer, ReadFile waits - until a byte arrives and then returns immediately. - - If no bytes arrive within the time specified by - ReadTotalTimeoutConstant, ReadFile times out. - */ - - timeouts.ReadIntervalTimeout = MAXDWORD - timeouts.ReadTotalTimeoutMultiplier = MAXDWORD - timeouts.ReadTotalTimeoutConstant = uint32(timeoutMs) - - r, _, err := syscall.Syscall(nSetCommTimeouts, 2, uintptr(h), uintptr(unsafe.Pointer(&timeouts)), 0) - if r == 0 { - return err - } - return nil -} - -func setupComm(h syscall.Handle, in, out int) error { - r, _, err := syscall.Syscall(nSetupComm, 3, uintptr(h), uintptr(in), uintptr(out)) - if r == 0 { - return err - } - return nil -} - -func setCommMask(h syscall.Handle) error { - const EV_RXCHAR = 0x0001 - r, _, err := syscall.Syscall(nSetCommMask, 2, uintptr(h), EV_RXCHAR, 0) - if r == 0 { - return err - } - return nil -} - -func resetEvent(h syscall.Handle) error { - r, _, err := syscall.Syscall(nResetEvent, 1, uintptr(h), 0, 0) - if r == 0 { - return err - } - return nil -} - -func purgeComm(h syscall.Handle) error { - const PURGE_TXABORT = 0x0001 - const PURGE_RXABORT = 0x0002 - const PURGE_TXCLEAR = 0x0004 - const PURGE_RXCLEAR = 0x0008 - r, _, err := syscall.Syscall(nPurgeComm, 2, uintptr(h), - PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR, 0) - if r == 0 { - return err - } - return nil -} - -func newOverlapped() (*syscall.Overlapped, error) { - var overlapped syscall.Overlapped - r, _, err := syscall.Syscall6(nCreateEvent, 4, 0, 1, 0, 0, 0, 0) - if r == 0 { - return nil, err - } - overlapped.HEvent = syscall.Handle(r) - return &overlapped, nil -} - -func getOverlappedResult(h syscall.Handle, overlapped *syscall.Overlapped) (int, error) { - var n int - r, _, err := syscall.Syscall6(nGetOverlappedResult, 4, - uintptr(h), - uintptr(unsafe.Pointer(overlapped)), - uintptr(unsafe.Pointer(&n)), 1, 0, 0) - if r == 0 { - return n, err - } - - return n, nil -} |