diff options
-rw-r--r-- | cmd/dolmetschctl/dolmetschctl.go | 5 | ||||
-rw-r--r-- | pkg/controller/controller.go | 92 | ||||
-rw-r--r-- | pkg/mixer/mixer.go | 7 |
3 files changed, 99 insertions, 5 deletions
diff --git a/cmd/dolmetschctl/dolmetschctl.go b/cmd/dolmetschctl/dolmetschctl.go index fe79332..0c03285 100644 --- a/cmd/dolmetschctl/dolmetschctl.go +++ b/cmd/dolmetschctl/dolmetschctl.go @@ -46,7 +46,10 @@ func main() { log.Printf("controller successfully initialized!") - // TODO: do something + if err = c.LedToggle(1); err != nil { + log.Printf("%v", err) + os.Exit(1) + } log.Printf("exiting.") } diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index b8d04e7..b982c56 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -22,17 +22,103 @@ package controller +import ( + "errors" + "fmt" + "strings" + + "github.com/scgolang/midi" +) + +const ( + NOTE_OFFSET_BUTTON = byte(0x00) + NUM_BUTTONS = 4 + + CC_LED = byte(0xB0) + NOTE_OFFSET_LED = byte(0x00) + NUM_LEDS = 4 + LED_OFF = byte(0x00) + LED_ON = byte(0x01) + LED_TOGGLE = byte(0x02) + LED_BLINK_MIN = byte(0x03) + LED_BLINK_MAX = byte(0x7f) +) + type Controller struct { + Dev *midi.Device +} + +func openDevice(devices []*midi.Device, prefix string) (d *midi.Device, err error) { + for _, device := range devices { + if strings.HasPrefix(device.Name, prefix) { + d = device + } + } + if d == nil { + return nil, errors.New("could not find device with prefix: " + prefix) + } + return d, d.Open() } func NewController(c Config) (*Controller, error) { - return &Controller{}, nil + devices, err := midi.Devices() + if err != nil { + return nil, err + } + + ctrl := &Controller{} + if ctrl.Dev, err = openDevice(devices, c.Dev); err != nil { + return nil, err + } + ctrl.Dev.QueueSize = 100 + + return ctrl, nil +} + +func (c *Controller) Init() error { + return nil } -func (m *Controller) Init() error { +func (c *Controller) Shutdown() error { + if c.Dev != nil { + c.Dev.Close() + } + // TODO: also close all subscribed channels + // terminate go-routine started by Init() return nil } -func (m *Controller) Shutdown() error { +func (c *Controller) setLed(num byte, value byte) error { + if num >= NUM_LEDS { + return fmt.Errorf("this controller has only %d leds.", NUM_LEDS) + } + + n, err := c.Dev.Write([]byte{CC_LED, NOTE_OFFSET_LED + num, value}) + if err != nil { + // reopen device? + return err + } + if n != 3 { + return errors.New("sending LED command failed.") + } return nil } + +func (c *Controller) LedOff(num byte) error { + return c.setLed(num, LED_OFF) +} + +func (c *Controller) LedOn(num byte) error { + return c.setLed(num, LED_ON) +} + +func (c *Controller) LedToggle(num byte) error { + return c.setLed(num, LED_TOGGLE) +} + +func (c *Controller) LedBlink(num, wait byte) error { + if (wait + LED_BLINK_MIN) > LED_BLINK_MAX { + return fmt.Errorf("blink wait must be between 0 and %d.", LED_BLINK_MAX-LED_BLINK_MIN) + } + return c.setLed(num, wait+LED_BLINK_MIN) +} diff --git a/pkg/mixer/mixer.go b/pkg/mixer/mixer.go index 7b46abc..6e8eb07 100644 --- a/pkg/mixer/mixer.go +++ b/pkg/mixer/mixer.go @@ -127,7 +127,7 @@ func openDevice(devices []*midi.Device, prefix string) (d *midi.Device, err erro } } if d == nil { - return nil, errors.New("could not find device with prefix " + prefix) + return nil, errors.New("could not find device with prefix: " + prefix) } return d, d.Open() } @@ -203,6 +203,7 @@ func (m *Mixer) Init() error { go func() { for { + // TODO: handle Errors (reopen the device!) m.handleMidiPacket(<-ch) } }() @@ -216,12 +217,15 @@ func (m *Mixer) Shutdown() error { if m.DevOut != nil { m.DevOut.Close() } + // TODO: also close all subscribed channels + // terminate go-routine started by Init() return nil } func (m *Mixer) sendMute(channel byte, value byte) error { n, err := m.DevOut.Write([]byte{CC_MUTE, channel, value}) if err != nil { + // reopen device? return err } if n != 3 { @@ -244,6 +248,7 @@ func (m *Mixer) SetLevel(ch Channel, level FaderLevel) error { } n, err := m.DevOut.Write([]byte{CC_FADER, byte(ch), byte(level)}) if err != nil { + // reopen device? return err } if n != 3 { |