Browse Source

Start to move to data driven command parser.

Georgi Chorbadzhiyski 9 years ago
parent
commit
9e99f9d7d2
1 changed files with 48 additions and 49 deletions
  1. 48
    49
      cmd.c

+ 48
- 49
cmd.c View File

18
 #include "cmd.h"
18
 #include "cmd.h"
19
 #include "util.h"
19
 #include "util.h"
20
 
20
 
21
+enum cmd_flags {
22
+	PARSE_NONE      = (1 << 0), /* The result if this command needs no parsing */
23
+	PARSE_CUSTOM    = (1 << 1), /* Use custom parser for this command */
24
+	PARSE_SLOT_TXT  = (1 << 2), /* Parse [slot_num] [slot_text] */
25
+	PARSE_SLOT_DEST = (1 << 3), /* Parse [slot_num] [dest_slot] */
26
+};
27
+
21
 static struct videohub_commands {
28
 static struct videohub_commands {
22
 	enum vcmd	cmd;
29
 	enum vcmd	cmd;
23
 	const char	*txt;
30
 	const char	*txt;
31
+	unsigned int	flags;
24
 } videohub_commands[] = {
32
 } videohub_commands[] = {
25
-	{ CMD_PROTOCOL_PREAMBLE,       "PROTOCOL PREAMBLE" },
26
-	{ CMD_VIDEOHUB_DEVICE,         "VIDEOHUB DEVICE" },
27
-	{ CMD_INPUT_LABELS,            "INPUT LABELS" },
28
-	{ CMD_OUTPUT_LABELS,           "OUTPUT LABELS" },
29
-	{ CMD_VIDEO_OUTPUT_LOCKS,      "VIDEO OUTPUT LOCKS" },
30
-	{ CMD_VIDEO_OUTPUT_ROUTING,    "VIDEO OUTPUT ROUTING" },
31
-	{ CMD_VIDEO_INPUT_STATUS,      "VIDEO INPUT STATUS" },
32
-	{ CMD_VIDEO_OUTPUT_STATUS,     "VIDEO OUTPUT STATUS" },
33
-	{ CMD_PING,                    "PING" },
34
-	{ CMD_ACK,                     "ACK" },
35
-	{ CMD_NAK,                     "NAK" },
33
+	{ CMD_PROTOCOL_PREAMBLE,    "PROTOCOL PREAMBLE",    PARSE_CUSTOM },
34
+	{ CMD_VIDEOHUB_DEVICE,      "VIDEOHUB DEVICE",      PARSE_CUSTOM },
35
+	{ CMD_INPUT_LABELS,         "INPUT LABELS",         PARSE_SLOT_TXT },
36
+	{ CMD_OUTPUT_LABELS,        "OUTPUT LABELS",        PARSE_SLOT_TXT },
37
+	{ CMD_VIDEO_OUTPUT_LOCKS,   "VIDEO OUTPUT LOCKS",   PARSE_SLOT_TXT },
38
+	{ CMD_VIDEO_OUTPUT_ROUTING, "VIDEO OUTPUT ROUTING", PARSE_SLOT_DEST },
39
+	{ CMD_VIDEO_INPUT_STATUS,   "VIDEO INPUT STATUS",   PARSE_SLOT_TXT },
40
+	{ CMD_VIDEO_OUTPUT_STATUS,  "VIDEO OUTPUT STATUS",  PARSE_SLOT_TXT },
41
+	{ CMD_PING,                 "PING",                 PARSE_NONE },
42
+	{ CMD_ACK,                  "ACK",                  PARSE_NONE },
43
+	{ CMD_NAK,                  "NAK",                  PARSE_NONE },
36
 };
44
 };
37
 
45
 
38
 static const char *get_cmd_text(enum vcmd cmd) {
46
 static const char *get_cmd_text(enum vcmd cmd) {
85
 	// Split line by line
93
 	// Split line by line
86
 	char *line, *saveptr = NULL;
94
 	char *line, *saveptr = NULL;
87
 	for(i = 0, line = strtok_r(cmd_data, "\n", &saveptr); line; line = strtok_r(NULL, "\n", &saveptr), i++) {
95
 	for(i = 0, line = strtok_r(cmd_data, "\n", &saveptr); line; line = strtok_r(NULL, "\n", &saveptr), i++) {
96
+
88
 		// Parse command data response looking like that: "[slot_pos] [slot_data]"
97
 		// Parse command data response looking like that: "[slot_pos] [slot_data]"
89
-		bool valid_slot = false;
90
-		unsigned int slot_pos = 0;
91
 		char *slot_data = NULL;
98
 		char *slot_data = NULL;
92
-		switch (v->cmd) {
93
-		case CMD_INPUT_LABELS:
94
-		case CMD_OUTPUT_LABELS:
95
-		case CMD_VIDEO_INPUT_STATUS:
96
-		case CMD_VIDEO_OUTPUT_STATUS:
97
-		case CMD_VIDEO_OUTPUT_LOCKS:
98
-		case CMD_VIDEO_OUTPUT_ROUTING:
99
+		unsigned int slot_pos = 0, dest_pos = 0;
100
+
101
+		if (v->flags & (PARSE_SLOT_TXT | PARSE_SLOT_DEST)) {
99
 			slot_data = strchr(line, ' ');
102
 			slot_data = strchr(line, ' ');
100
-			if (slot_data) {
101
-				slot_data[0] = '\0'; // Separate slot_pos from slot_data
102
-				slot_data++;
103
-				slot_pos = strtoul(line, NULL, 10);
104
-				if (slot_pos < ARRAY_SIZE(data->outputs))
105
-					valid_slot = true;
103
+			if (!slot_data)
104
+				continue;
105
+			slot_data[0] = '\0'; // Separate slot_pos from slot_data
106
+			slot_data++;
107
+			slot_pos = strtoul(line, NULL, 10);
108
+			if (slot_pos + 1 > data->device.num_video_outputs) {
109
+				q("WARNING: %s - invalid slot %u\n", v->txt, slot_pos);
110
+				continue;
111
+			}
112
+		}
113
+
114
+		if (v->flags & PARSE_SLOT_DEST) {
115
+			dest_pos = strtoul(slot_data, NULL, 10);
116
+			if (dest_pos + 1 > data->device.num_video_inputs) {
117
+				q("WARNING: %s - invalid dest %u\n", v->txt, dest_pos);
118
+				continue;
106
 			}
119
 			}
107
-			break;
108
-		default:
109
-			break;
110
 		}
120
 		}
111
 
121
 
112
 		// Parse commands
122
 		// Parse commands
145
 			break;
155
 			break;
146
 
156
 
147
 		case CMD_INPUT_LABELS:
157
 		case CMD_INPUT_LABELS:
148
-			if (valid_slot)
149
-				snprintf(data->inputs[slot_pos].name, sizeof(data->inputs[slot_pos].name), "%s", slot_data);
158
+			snprintf(data->inputs[slot_pos].name, sizeof(data->inputs[slot_pos].name), "%s", slot_data);
150
 			break;
159
 			break;
151
 
160
 
152
 		case CMD_OUTPUT_LABELS:
161
 		case CMD_OUTPUT_LABELS:
153
-			if (valid_slot)
154
-				snprintf(data->outputs[slot_pos].name, sizeof(data->inputs[slot_pos].name), "%s", slot_data);
162
+			snprintf(data->outputs[slot_pos].name, sizeof(data->outputs[slot_pos].name), "%s", slot_data);
155
 			break;
163
 			break;
156
 
164
 
157
 		case CMD_VIDEO_INPUT_STATUS:
165
 		case CMD_VIDEO_INPUT_STATUS:
158
-			if (valid_slot)
159
-				snprintf(data->inputs[slot_pos].status, sizeof(data->inputs[slot_pos].status), "%s", slot_data);
166
+			snprintf(data->inputs[slot_pos].status, sizeof(data->inputs[slot_pos].status), "%s", slot_data);
160
 			break;
167
 			break;
161
 
168
 
162
 		case CMD_VIDEO_OUTPUT_STATUS:
169
 		case CMD_VIDEO_OUTPUT_STATUS:
163
-			if (valid_slot)
164
-				snprintf(data->outputs[slot_pos].status, sizeof(data->outputs[slot_pos].status), "%s", slot_data);
170
+			snprintf(data->outputs[slot_pos].status, sizeof(data->outputs[slot_pos].status), "%s", slot_data);
165
 			break;
171
 			break;
166
 
172
 
167
 		case CMD_VIDEO_OUTPUT_LOCKS:
173
 		case CMD_VIDEO_OUTPUT_LOCKS:
168
-			if (valid_slot) {
169
-				switch (slot_data[0]) {
170
-				case 'O': data->outputs[slot_pos].lock = PORT_LOCKED; break;
171
-				case 'L': data->outputs[slot_pos].lock = PORT_LOCKED_OTHER; break;
172
-				default : data->outputs[slot_pos].lock = PORT_UNLOCKED; break;
173
-				}
174
+			switch (slot_data[0]) {
175
+			case 'O': data->outputs[slot_pos].lock = PORT_LOCKED; break;
176
+			case 'L': data->outputs[slot_pos].lock = PORT_LOCKED_OTHER; break;
177
+			default : data->outputs[slot_pos].lock = PORT_UNLOCKED; break;
174
 			}
178
 			}
175
 			break;
179
 			break;
176
 
180
 
177
 		case CMD_VIDEO_OUTPUT_ROUTING:
181
 		case CMD_VIDEO_OUTPUT_ROUTING:
178
-			if (valid_slot) {
179
-				unsigned int dest_pos = strtoul(slot_data, NULL, 10);
180
-				if (dest_pos < ARRAY_SIZE(data->inputs))
181
-					data->outputs[slot_pos].routed_to = dest_pos;
182
-			}
183
-			break;
182
+			data->outputs[slot_pos].routed_to = dest_pos;
184
 
183
 
185
 		case CMD_PING:
184
 		case CMD_PING:
186
 		case CMD_ACK:
185
 		case CMD_ACK:

Loading…
Cancel
Save