insert routes to main and driver
This commit is contained in:
@@ -2,6 +2,7 @@ package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
@@ -15,43 +16,45 @@ const (
|
||||
|
||||
// Art-Net Interface
|
||||
type Bus struct {
|
||||
ip string `yaml:"ip"`
|
||||
port int `yaml:"port"`
|
||||
Devices []*Device `yaml:"devices"`
|
||||
Data *DMX
|
||||
Name string `yaml:"name" json:"name"`
|
||||
Ip string `yaml:"ip" json:"ip"`
|
||||
Port *int `yaml:"port" json:"port,omitempty"`
|
||||
Data *DMX `yaml:"-" json:"-"`
|
||||
}
|
||||
|
||||
// adds new Art-Net interface to driver port 0 = 6454 (default art-net)
|
||||
func NewBus(ip string, port int) *Bus {
|
||||
func NewBus(name, ip string, port int) *Bus {
|
||||
if port == 0 {
|
||||
port = artPort
|
||||
}
|
||||
|
||||
i := Bus{
|
||||
ip: ip,
|
||||
port: port,
|
||||
Name: name,
|
||||
Ip: ip,
|
||||
Port: &port,
|
||||
Data: NewDMXUniverse(),
|
||||
}
|
||||
return &i
|
||||
}
|
||||
|
||||
// adds new dmx device to interface
|
||||
func (i *Bus) AddDevice(address uint, channels uint) (*Device, error) {
|
||||
d := NewDevice(address, channels, i.Data)
|
||||
i.Devices = append(i.Devices, d)
|
||||
return d, nil
|
||||
// get bus port from pointer
|
||||
func (b *Bus) GetPort() int {
|
||||
if b.Port == nil {
|
||||
return artPort
|
||||
}
|
||||
return *b.Port
|
||||
}
|
||||
|
||||
// start polling dmx data in milliseconds 0 = aprox. 44Hertz
|
||||
func (i *Bus) Poll(interval time.Duration) error {
|
||||
func (b *Bus) Poll(interval time.Duration) error {
|
||||
if interval == 0 {
|
||||
interval = 23
|
||||
}
|
||||
|
||||
// Send packet over UDP
|
||||
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
|
||||
IP: net.ParseIP(i.ip),
|
||||
Port: i.port,
|
||||
IP: net.ParseIP(b.Ip),
|
||||
Port: *b.Port,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
@@ -63,7 +66,7 @@ func (i *Bus) Poll(interval time.Duration) error {
|
||||
for {
|
||||
go func() {
|
||||
for {
|
||||
if reached, _ := isUDPReachable(i.ip); !reached {
|
||||
if reached, _ := isUDPReachable(b.Ip); !reached {
|
||||
if errCount > 20 {
|
||||
break
|
||||
} else {
|
||||
@@ -77,7 +80,7 @@ func (i *Bus) Poll(interval time.Duration) error {
|
||||
}
|
||||
}()
|
||||
|
||||
_, err = conn.Write(NewArtNetPackage(i.Data))
|
||||
_, err = conn.Write(NewArtNetPackage(b.Data))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -90,11 +93,11 @@ func (i *Bus) Poll(interval time.Duration) error {
|
||||
}
|
||||
|
||||
// start polling dmx data in milliseconds 0 = aprox. 44Hertz
|
||||
func (i *Bus) SendData() error {
|
||||
func (b *Bus) SendData() error {
|
||||
// Send packet over UDP
|
||||
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
|
||||
IP: net.ParseIP(i.ip),
|
||||
Port: i.port,
|
||||
IP: net.ParseIP(b.Ip),
|
||||
Port: *b.Port,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
@@ -102,29 +105,21 @@ func (i *Bus) SendData() error {
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
errChan := make(chan error)
|
||||
go func() {
|
||||
if reached, _ := isUDPReachable(i.ip); !reached {
|
||||
errChan <- fmt.Errorf("device not reachable")
|
||||
if reached, err := isUDPReachable(b.Ip); err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
} else if !reached {
|
||||
log.Println("device not reachable")
|
||||
return
|
||||
}
|
||||
errChan <- nil
|
||||
}()
|
||||
|
||||
err = <-errChan
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = conn.Write(NewArtNetPackage(i.Data))
|
||||
_, err = conn.Write(NewArtNetPackage(b.Data))
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
const (
|
||||
protocolICMP = 1
|
||||
)
|
||||
|
||||
func isUDPReachable(ip string) (recieved bool, err error) {
|
||||
p := fastping.NewPinger()
|
||||
ra, err := net.ResolveIPAddr("ip4:icmp", ip)
|
||||
@@ -132,10 +127,11 @@ func isUDPReachable(ip string) (recieved bool, err error) {
|
||||
return
|
||||
}
|
||||
p.AddIPAddr(ra)
|
||||
|
||||
p.OnRecv = func(addr *net.IPAddr, rtt time.Duration) {
|
||||
recieved = true
|
||||
return
|
||||
}
|
||||
|
||||
p.OnIdle = func() {}
|
||||
|
||||
err = p.Run()
|
||||
|
Reference in New Issue
Block a user