push2: port registration, LED setup
[ardour.git] / libs / surfaces / push2 / push2.h
1 /*
2     Copyright (C) 2016 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifndef __ardour_push2_h__
20 #define __ardour_push2_h__
21
22 #include <vector>
23 #include <map>
24 #include <list>
25 #include <set>
26
27 #include <libusb.h>
28
29 #include <cairomm/refptr.h>
30 #include <glibmm/threads.h>
31
32 #define ABSTRACT_UI_EXPORTS
33 #include "pbd/abstract_ui.h"
34 #include "midi++/types.h"
35 #include "ardour/types.h"
36 #include "control_protocol/control_protocol.h"
37
38 #include "midi_byte_array.h"
39
40 namespace Cairo {
41         class ImageSurface;
42 }
43
44 namespace MIDI {
45         class Parser;
46         class Port;
47 }
48
49 namespace ARDOUR {
50         class AsyncMIDIPort;
51         class Port;
52 }
53
54 namespace ArdourSurface {
55
56 struct Push2Request : public BaseUI::BaseRequestObject {
57 public:
58         Push2Request () {}
59         ~Push2Request () {}
60 };
61
62 class Push2 : public ARDOUR::ControlProtocol
63             , public AbstractUI<Push2Request>
64 {
65    public:
66         Push2 (ARDOUR::Session&);
67         ~Push2 ();
68
69         static bool probe ();
70         static void* request_factory (uint32_t);
71
72         int set_active (bool yn);
73
74    private:
75         libusb_device_handle *handle;
76         Glib::Threads::Mutex fb_lock;
77         uint8_t   frame_header[16];
78         uint16_t* device_frame_buffer[2];
79         int  device_buffer;
80         Cairo::RefPtr<Cairo::ImageSurface> frame_buffer;
81         sigc::connection vblank_connection;
82
83         static const int cols;
84         static const int rows;
85         static const int pixels_per_row;
86
87         void do_request (Push2Request*);
88         int stop ();
89         int open ();
90         int close ();
91         int render ();
92         bool vblank ();
93
94         struct LED
95         {
96                 enum State {
97                         Off,
98                         OneShot24th,
99                         OneShot16th,
100                         OneShot8th,
101                         OneShot4th,
102                         OneShot2th,
103                         Pulsing24th,
104                         Pulsing16th,
105                         Pulsing8th,
106                         Pulsing4th,
107                         Pulsing2th,
108                         Blinking24th,
109                         Blinking16th,
110                         Blinking8th,
111                         Blinking4th,
112                         Blinking2th
113                 };
114
115                 enum Type {
116                         Pad,
117                         ColorButton,
118                         WhiteButton,
119                         TouchStrip,
120                 };
121
122
123
124                 uint8_t id;
125                 Type    type;
126                 uint8_t extra;
127                 uint8_t color_index;
128                 uint8_t state;
129
130                 LED (uint8_t i, Type t, uint8_t e) : id (i), type (t), extra (e), color_index (0), state (Off) {}
131                 LED () : id (0), type (Pad), extra (0), color_index (0), state (Off) {}
132
133                 MidiByteArray update ();
134
135                 void set_color (uint8_t color_index);
136                 void set_state (State state);
137         };
138
139         std::map<int,LED> leds;
140         void set_led_color (uint32_t id, uint8_t color_index);
141         void set_led_state (uint32_t id, LED::State);
142         void build_led_map ();
143
144         MIDI::Port* _input_port[2];
145         MIDI::Port* _output_port[2];
146         boost::shared_ptr<ARDOUR::Port> _async_in[2];
147         boost::shared_ptr<ARDOUR::Port> _async_out[2];
148
149         void write (int port, const MidiByteArray&);
150 };
151
152
153 } /* namespace */
154
155 #endif /* __ardour_push2_h__ */