insert routes to main and driver

This commit is contained in:
Adrian Zuercher
2025-04-21 09:56:30 +02:00
parent b777716aa7
commit 7b201f6e63
10 changed files with 405 additions and 121 deletions

View File

@@ -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()