Files
dmxconnect/hardware/hardware.go

91 lines
2.4 KiB
Go
Raw Normal View History

package hardware
import (
"context"
2025-11-02 10:57:53 +01:00
"errors"
"fmt"
"sync"
"github.com/rs/zerolog/log"
)
2025-11-24 19:23:50 +01:00
// Manager is the class who manages the hardware
type Manager struct {
2025-11-29 17:42:42 +01:00
mu sync.Mutex
2025-11-02 10:57:53 +01:00
wg sync.WaitGroup
2025-12-01 19:12:01 +01:00
providers map[string]Provider // The map of endpoints providers
2025-12-02 18:58:56 +01:00
devices map[string]*Device // The map of devices
2025-12-01 19:12:01 +01:00
DetectedEndpoints map[string]Endpoint // The current list of endpoints
SavedEndpoints map[string]EndpointInfo // The list of stored endpoints
}
2025-11-24 19:23:50 +01:00
// NewManager creates a new hardware manager
func NewManager() *Manager {
log.Trace().Str("package", "hardware").Msg("Hardware instance created")
2025-11-24 19:23:50 +01:00
return &Manager{
2025-12-01 19:12:01 +01:00
providers: make(map[string]Provider, 0),
2025-12-02 18:58:56 +01:00
devices: make(map[string]*Device, 0),
DetectedEndpoints: make(map[string]Endpoint, 0),
SavedEndpoints: make(map[string]EndpointInfo, 0),
}
}
// Start starts to find new endpoint events
2025-11-24 19:23:50 +01:00
func (h *Manager) Start(ctx context.Context) error {
for providerName, provider := range h.providers {
2025-11-29 17:42:42 +01:00
// Initialize the provider
err := provider.Initialize()
if err != nil {
log.Err(err).Str("file", "hardware").Str("providerName", providerName).Msg("unable to initialize provider")
return err
}
2025-11-29 17:42:42 +01:00
// Set callback functions
provider.OnArrival(h.OnEndpointArrival)
provider.OnRemoval(h.OnEndpointRemoval)
2025-11-29 17:42:42 +01:00
// Start the provider
err = provider.Start(ctx)
if err != nil {
log.Err(err).Str("file", "hardware").Str("providerName", providerName).Msg("unable to start provider")
return err
}
}
2025-11-29 17:42:42 +01:00
return nil
}
2025-11-02 10:57:53 +01:00
// WaitStop stops the hardware manager
2025-11-24 19:23:50 +01:00
func (h *Manager) WaitStop() error {
2025-11-02 10:57:53 +01:00
log.Trace().Str("file", "hardware").Msg("closing the hardware manager")
// Stop each provider
2025-11-02 10:57:53 +01:00
var errs []error
for name, f := range h.providers {
2025-11-02 10:57:53 +01:00
if err := f.WaitStop(); err != nil {
errs = append(errs, fmt.Errorf("%s: %w", name, err))
}
}
// Wait for all the endpoints to close
log.Trace().Str("file", "MIDIProvider").Msg("closing all MIDI endpoints")
for registeredEndpointSN, registeredEndpoint := range h.DetectedEndpoints {
err := registeredEndpoint.WaitStop()
2025-11-29 17:42:42 +01:00
if err != nil {
errs = append(errs, fmt.Errorf("%s: %w", registeredEndpointSN, err))
2025-11-29 17:42:42 +01:00
}
}
2025-11-02 10:57:53 +01:00
// Wait for goroutines to finish
h.wg.Wait()
// Returning errors
if len(errs) > 0 {
return errors.Join(errs...)
}
log.Info().Str("file", "hardware").Msg("hardware manager stopped")
return nil
}