const (
IGNBRK = tcflag_t (0000001)
BRKINT = tcflag_t (0000002)
- IGNPAR = tcflag_t (0000004)
- PARMRK = tcflag_t (0000010)
- INLCR = tcflag_t (0000100)
- ECHONL = tcflag_t (0000100)
- IGNCR = tcflag_t (0000200)
- ICRNL = tcflag_t (0000400)
- INPCK = tcflag_t (0000020)
- ISTRIP = tcflag_t (0000040)
- IXON = tcflag_t (0002000)
- OPOST = tcflag_t (0000001)
- CS8 = tcflag_t (0000060)
- ECHO = tcflag_t (0000010)
- ICANON = tcflag_t (0000002)
- IEXTEN = tcflag_t (0100000)
- ISIG = tcflag_t (0000001)
- VTIME = tcflag_t (5)
- VMIN = tcflag_t (6)
- CBAUD = tcflag_t (0010017)
- CBAUDEX = tcflag_t (0010000)
+ syscall.IGNPAR = tcflag_t (0000004)
+ syscall.PARMRK = tcflag_t (0000010)
+ syscall.INLCR = tcflag_t (0000100)
+ syscall.ECHONL = tcflag_t (0000100)
+ syscall.IGNCR = tcflag_t (0000200)
+ syscall.ICRNL = tcflag_t (0000400)
+ syscall.INPCK = tcflag_t (0000020)
+ syscall.ISTRIP = tcflag_t (0000040)
+ syscall.IXON = tcflag_t (0002000)
+ syscall.OPOST = tcflag_t (0000001)
+ syscall.CS8 = tcflag_t (0000060)
+ syscall.ECHO = tcflag_t (0000010)
+ syscall.ICANON = tcflag_t (0000002)
+ syscall.IEXTEN = tcflag_t (0100000)
+ syscall.ISIG = tcflag_t (0000001)
+ syscall.VTIME = tcflag_t (5)
+ syscall.VMIN = tcflag_t (6)
+ syscall.CBAUD = tcflag_t (0010017)
+ syscall..CBAUDEX = tcflag_t (0010000)
)
const (
)
func getTermios(ttyfd uintptr, dst *termios) error {
- r1, _, errno := syscall.Syscall (syscall.SYS_IOCTL,
+ r1, _, errno := syscall. (syscall.SYS_IOCTL,
uintptr (ttyfd), uintptr (TCGETS),
uintptr (unsafe.Pointer (dst)));
}
func setTermios(ttyfd uintptr, src *termios) error {
- r1, _, errno := syscall.Syscall (syscall.SYS_IOCTL,
+ r1, _, errno := syscall. (syscall.SYS_IOCTL,
uintptr (ttyfd), uintptr (TCSETS),
uintptr (unsafe.Pointer (src)));
var orig_termios termios;
if err := getTermios (fd, &orig_termios); err != nil { return err}
- orig_termios.c_iflag &= ^(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
- orig_termios.c_oflag &= ^(OPOST);
- orig_termios.c_lflag &= ^(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
- orig_termios.c_cflag |= (CS8);
+ orig_termios.c_iflag &= ^(syscall.IGNBRK|syscall.BRKINT|syscall.PARMRK|syscall.ISTRIP|syscall.INLCR|syscall.IGNCR|syscall.ICRNL|syscall.IXON);
+ orig_termios.c_oflag &= ^(syscall.OPOST);
+ orig_termios.c_lflag &= ^(syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.IEXTEN | syscall.ISIG);
+ orig_termios.c_cflag |= (syscall.CS8);
- orig_termios.c_cc[VMIN] = 1;
- orig_termios.c_cc[VTIME] = 0;
+ orig_termios.c_cc[syscall.VMIN] = 1;
+ orig_termios.c_cc[syscall.VTIME] = 0;
return setTermios(fd, &orig_termios)
}
orig_termios.c_ispeed = speed
orig_termios.c_ospeed = speed
//~ //input baudrate == output baudrate and we ignore special case B0
- //~ orig_termios.c_cflag &= ^(CBAUD | CBAUDEX)
+ //~ orig_termios.c_cflag &= ^(syscall.CBAUD | syscall..CBAUDEX)
//~ orig_termios.c_cflag |= speed
if err = setTermios(fd, &orig_termios); err != nil { return }
if err = getTermios (fd, &orig_termios); err != nil { return }
err = errors.New("Failed to set speed")
}
//~ if err = getTermios (fd, &orig_termios); err != nil { return }
- //~ if orig_termios.c_cflag & (CBAUD | CBAUDEX) != speed {
+ //~ if orig_termios.c_cflag & (syscall.CBAUD | syscall.CBAUDEX) != speed {
//~ err = errors.New("Failed to set speed")
//~ }
return
package main
import (
- "flag"
- "time"
- zmq "github.com/vaughan0/go-zmq"
-)
+ "flag"
+ "time"
+ zmq "github.com/vaughan0/go-zmq"
+)
// ---------- Main Code -------------
var (
- tty_dev_ string
- pub_addr string
- use_syslog_ bool
- enable_debug_ bool
- serial_speed_ uint
+ tty_dev_ string
+ pub_addr string
+ use_syslog_ bool
+ enable_debug_ bool
+ serial_speed_ uint
)
const exponential_backof_activation_threshold int64 = 4
func init() {
- flag.StringVar(&pub_addr, "brokeraddr", "tcp://torwaechter.realraum.at:4243", "zmq address to send stuff to")
- flag.StringVar(&tty_dev_, "ttydev", "/dev/ttyACM0", "path do tty uc device")
- flag.UintVar(&serial_speed_, "serspeed", 0, "tty baudrate (0 to disable setting a baudrate e.g. in case of ttyACM)")
- flag.BoolVar(&use_syslog_, "syslog", false, "log to syslog local1 facility")
- flag.BoolVar(&enable_debug_, "debug", false, "debugging messages on")
- flag.Parse()
+ flag.StringVar(&pub_addr, "brokeraddr", "tcp://torwaechter.realraum.at:4243", "zmq address to send stuff to")
+ flag.StringVar(&tty_dev_, "ttydev", "/dev/ttyACM0", "path do tty uc device")
+ flag.UintVar(&serial_speed_, "serspeed", 0, "tty baudrate (0 to disable setting a baudrate e.g. in case of ttyACM)")
+ flag.BoolVar(&use_syslog_, "syslog", false, "log to syslog local1 facility")
+ flag.BoolVar(&enable_debug_, "debug", false, "debugging messages on")
+ flag.Parse()
}
-func ConnectSerialToZMQ(pub_sock *zmq.Socket) {
- defer func() {
- if x:= recover(); x != nil { Syslog_.Println(x) }
- }()
+func ConnectSerialToZMQ(pub_sock *zmq.Socket, timeout time.Duration) {
+ defer func() {
+ if x := recover(); x != nil {
+ Syslog_.Println(x)
+ }
+ }()
+
+ serial_wr, serial_rd, err := OpenAndHandleSerial(tty_dev_, serial_speed_)
+ if err != nil {
+ panic(err)
+ }
+ defer close(serial_wr)
- serial_wr, serial_rd, err := OpenAndHandleSerial(tty_dev_, serial_speed_)
- if err != nil { panic(err) }
- defer close(serial_wr)
+ t := time.NewTimer(timeout)
+ for {
+ select {
+ case incoming_ser_line, seropen := <-serial_rd:
+ if !seropen {
+ return
+ }
+ t.Reset(timeout)
+ Syslog_.Printf("%s", incoming_ser_line)
+ if err := pub_sock.Send(incoming_ser_line); err != nil {
+ Syslog_.Println(err.Error())
+ }
- for incoming_ser_line := range(serial_rd) {
- Syslog_.Printf("%s",incoming_ser_line)
- if err := pub_sock.Send(incoming_ser_line); err != nil { Syslog_.Println(err.Error()) }
- }
+ case <-t.C:
+ Syslog_.Print("Timeout, no message for 120 seconds")
+ }
+ }
}
func main() {
- zmqctx, pub_sock := ZmqsInit(pub_addr)
- if pub_sock == nil { panic("zmq socket creation failed") }
- defer zmqctx.Close()
- defer pub_sock.Close()
+ zmqctx, pub_sock := ZmqsInit(pub_addr)
+ if pub_sock == nil {
+ panic("zmq socket creation failed")
+ }
+ defer zmqctx.Close()
+ defer pub_sock.Close()
- if enable_debug_ {
- LogEnableDebuglog()
- } else if use_syslog_ {
- LogEnableSyslog()
- Syslog_.Print("started")
- }
+ if enable_debug_ {
+ LogEnableDebuglog()
+ } else if use_syslog_ {
+ LogEnableSyslog()
+ Syslog_.Print("started")
+ }
- var backoff_exp uint32 = 0
- for {
- start_time := time.Now().Unix()
- ConnectSerialToZMQ(pub_sock)
- run_time := time.Now().Unix() - start_time
- if run_time > exponential_backof_activation_threshold {
- backoff_exp = 0
- }
- time.Sleep(150*(1 << backoff_exp) * time.Millisecond)
- if backoff_exp < 12 { backoff_exp++ }
- }
+ var backoff_exp uint32 = 0
+ for {
+ start_time := time.Now().Unix()
+ ConnectSerialToZMQ(pub_sock, time.Second*120)
+ run_time := time.Now().Unix() - start_time
+ if run_time > exponential_backof_activation_threshold {
+ backoff_exp = 0
+ }
+ time.Sleep(150 * (1 << backoff_exp) * time.Millisecond)
+ if backoff_exp < 12 {
+ backoff_exp++
+ }
+ }
}