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,21 +18,29 @@
18 18
 #include "cmd.h"
19 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 28
 static struct videohub_commands {
22 29
 	enum vcmd	cmd;
23 30
 	const char	*txt;
31
+	unsigned int	flags;
24 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 46
 static const char *get_cmd_text(enum vcmd cmd) {
@@ -85,28 +93,30 @@ bool parse_command(struct videohub_data *data, char *cmd) {
85 93
 	// Split line by line
86 94
 	char *line, *saveptr = NULL;
87 95
 	for(i = 0, line = strtok_r(cmd_data, "\n", &saveptr); line; line = strtok_r(NULL, "\n", &saveptr), i++) {
96
+
88 97
 		// Parse command data response looking like that: "[slot_pos] [slot_data]"
89
-		bool valid_slot = false;
90
-		unsigned int slot_pos = 0;
91 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 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 122
 		// Parse commands
@@ -145,42 +155,31 @@ bool parse_command(struct videohub_data *data, char *cmd) {
145 155
 			break;
146 156
 
147 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 159
 			break;
151 160
 
152 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 163
 			break;
156 164
 
157 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 167
 			break;
161 168
 
162 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 171
 			break;
166 172
 
167 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 179
 			break;
176 180
 
177 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 184
 		case CMD_PING:
186 185
 		case CMD_ACK:

Loading…
Cancel
Save