aboutsummaryrefslogtreecommitdiffhomepage
path: root/backends/maweb.h
blob: 8efe6a839b7829f0581f6f369d0eead77e1befdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "midimonster.h"

MM_PLUGIN_API int init();
static int maweb_configure(char* option, char* value);
static int maweb_configure_instance(instance* inst, char* option, char* value);
static int maweb_instance(instance* inst);
static channel* maweb_channel(instance* inst, char* spec, uint8_t flags);
static int maweb_set(instance* inst, size_t num, channel** c, channel_value* v);
static int maweb_handle(size_t num, managed_fd* fds);
static int maweb_start(size_t n, instance** inst);
static int maweb_shutdown(size_t n, instance** inst);
static uint32_t maweb_interval();

//Default login password: MD5("midimonster")
#define MAWEB_DEFAULT_PASSWORD "2807623134739142b119aff358f8a219"
#define MAWEB_DEFAULT_PORT "80"
#define MAWEB_RECV_CHUNK 1024
#define MAWEB_XMIT_CHUNK 4096
#define MAWEB_FRAME_HEADER_LENGTH 16
#define MAWEB_CONNECTION_KEEPALIVE 10000

typedef enum /*_maweb_channel_type*/ {
	type_unset = 0,
	exec_fader = 1,
	exec_button = 2, //gma: 0 dot: 0
	exec_lower = 3, //gma: 1 dot: 1
	exec_upper = 4, //gma: 2 dot: 0
	cmdline
} maweb_channel_type;

typedef enum /*_maweb_peer_type*/ {
	peer_unidentified = 0,
	peer_ma2,
	peer_ma3,
	peer_dot2
} maweb_peer_type;

typedef enum /*_ws_conn_state*/ {
	ws_new,
	ws_http,
	ws_open,
	ws_closed
} maweb_state;

typedef enum /*_maweb_cmdline_mode*/ {
	cmd_remote = 0,
	cmd_console,
	cmd_downgrade
} maweb_cmdline_mode;

typedef enum /*_ws_frame_op*/ {
	ws_text = 1,
	ws_binary = 2,
	ws_ping = 9,
	ws_pong = 10
} maweb_operation;

typedef struct {
	char* name;
	unsigned lua;
	uint8_t press;
	uint8_t release;
	uint8_t auto_submit;
} maweb_command_key;

typedef struct /*_maweb_channel*/ {
	maweb_channel_type type;
	uint16_t page;
	uint16_t index;

	uint8_t input_blocked;

	double in;
	double out;

	//reverse reference required because the identifiers are not stable
	//because we sort the backing store...
	channel* chan;
} maweb_channel_data;

typedef struct /*_maweb_instance_data*/ {
	size_t next_host;
	size_t hosts;
	char** host;
	char** port;

	char* user;
	char* pass;

	uint8_t login;
	int64_t session;
	maweb_peer_type peer_type;

	size_t channels;
	maweb_channel_data* channel;
	maweb_cmdline_mode cmdline;

	int fd;
	maweb_state state;
	size_t offset;
	size_t allocated;
	uint8_t* buffer;

	uint64_t updates_inflight;
} maweb_instance_data;