#ifndef ardour_surface_console1_button_h #define ardour_surface_console1_button_h #include "ardour/debug.h" #include "console1.h" namespace ArdourSurface { using namespace PBD; using ControllerID = Console1::ControllerID; class Controller { public: enum ControllerType { CONTROLLER, CONTROLLER_BUTTON, MULTISTATE_BUTTON, ENCODER, METER }; Controller (Console1& console1, ControllerID id) : console1 (console1) , _id (id) { } virtual ~Controller () {} Console1& console1; ControllerID id () const { return _id; } virtual ControllerType get_type () { return CONTROLLER; } protected: ControllerID _id; }; class ControllerButton : public Controller { public: ControllerButton (Console1& console1, ControllerID id, boost::function action, boost::function shift_action = 0) : Controller (console1, id) , action (action) , shift_action (shift_action) { console1.buttons.insert (std::make_pair (id, *this)); } ControllerType get_type () { return CONTROLLER_BUTTON; } virtual void set_led_state (bool onoff) { // DEBUG_TRACE(DEBUG::Console1, "ControllerButton::set_led_state ...\n"); MIDI::byte buf[3]; buf[0] = 0xB0; buf[1] = _id; buf[2] = onoff ? 127 : 0; console1.write (buf, 3); } virtual void set_led_value (uint32_t val) { // DEBUG_TRACE(DEBUG::Console1, "ControllerButton::set_led_state ...\n"); MIDI::byte buf[3]; buf[0] = 0xB0; buf[1] = _id; buf[2] = val; console1.write (buf, 3); } boost::function action; boost::function shift_action; }; class MultiStateButton : public Controller { public: MultiStateButton (Console1& console1, ControllerID id, std::vector state_values, boost::function action, boost::function shift_action = 0) : Controller (console1, id) , action (action) , shift_action (shift_action) , state_values (state_values) { console1.multi_buttons.insert (std::make_pair (id, *this)); } ControllerType get_type () { return MULTISTATE_BUTTON; } virtual void set_led_state (uint32_t state) { if (state >= state_values.size ()) return; MIDI::byte buf[3]; buf[0] = 0xB0; buf[1] = _id; buf[2] = state_values[state]; console1.write (buf, 3); } uint32_t state_count () { return state_values.size (); } boost::function action; boost::function shift_action; private: std::vector state_values; }; class Meter : public Controller { public: Meter (Console1& console1, ControllerID id, boost::function action, boost::function shift_action = 0) : Controller (console1, id) , action (action) , shift_action (shift_action) { console1.meters.insert (std::make_pair (id, *this)); } ControllerType get_type () { return METER; } virtual void set_value (uint32_t value) { MIDI::byte buf[3]; buf[0] = 0xB0; buf[1] = _id; buf[2] = value; console1.write (buf, 3); } boost::function action; boost::function shift_action; }; class Encoder : public Controller { public: Encoder (Console1& console1, ControllerID id, boost::function action, boost::function shift_action = 0) : Controller (console1, id) , action (action) , shift_action (shift_action) { console1.encoders.insert (std::make_pair (id, *this)); } ControllerType get_type () { return ENCODER; } virtual void set_value (uint32_t value) { MIDI::byte buf[3]; buf[0] = 0xB0; buf[1] = _id; buf[2] = value; console1.write (buf, 3); } boost::function action; boost::function shift_action; }; } #endif // ardour_surface_console1_button_h