static int parse_arg(catcierge_template_matcher_args_t *args,
	catcierge_haar_matcher_args_t *hargs, const char *key, char **values, size_t value_count)
{
	int res;

	res = catcierge_template_matcher_parse_args(args, key, values, value_count);
	if (res < 0)
	{
		return -1;
	}

	res = catcierge_haar_matcher_parse_args(hargs, key, values, value_count);
	if (res < 0)
	{
		return -1;
	}

	return 0;
}
示例#2
0
int catcierge_parse_setting(catcierge_args_t *args, const char *key, char **values, size_t value_count)
{
	size_t i;
	int ret;
	assert(args);
	assert(key);

	if (!strcmp(key, "matcher"))
	{
		if (value_count == 1)
		{
			args->matcher = values[0];
			if (strcmp(args->matcher, "template")
				&& strcmp(args->matcher, "haar"))
			{
				fprintf(stderr, "Invalid template type \"%s\"\n", args->matcher);
				return -1;
			}

			args->matcher_type = !strcmp(args->matcher, "template")
				? MATCHER_TEMPLATE : MATCHER_HAAR;

			return 0;
		}
		else
		{
			fprintf(stderr, "Missing value for --matcher\n");
			return -1;
		}

		return 0;
	}

	ret = catcierge_haar_matcher_parse_args(&args->haar, key, values, value_count);
	if (ret < 0) return -1;
	else if (!ret) return 0;

	ret = catcierge_template_matcher_parse_args(&args->templ, key, values, value_count);
	if (ret < 0) return -1;
	else if (!ret) return 0;

	if (!strcmp(key, "show"))
	{
		args->show = 1;
		if (value_count == 1) args->show = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "ok_matches_needed"))
	{
		if (value_count == 1)
		{
			args->ok_matches_needed = atoi(values[0]);

			if ((args->ok_matches_needed < 0)
				|| (args->ok_matches_needed > MATCH_MAX_COUNT))
			{
				fprintf(stderr, "--ok_matches_needed must be between 0 and %d\n", MATCH_MAX_COUNT);
				return -1;
			}

			return 0;
		}

		fprintf(stderr, "--ok_matches_needed missing an integer value\n");
		return -1;
	}

	if (!strcmp(key, "lockout_method"))
	{
		if (value_count == 1)
		{
			args->lockout_method = atoi(values[0]);

			if ((args->lockout_method < OBSTRUCT_OR_TIMER_1)
			 || (args->lockout_method > TIMER_ONLY_3))
			{
				fprintf(stderr, "--lockout_method needs a value between %d and %d\n",
					OBSTRUCT_OR_TIMER_1, TIMER_ONLY_3);
				return -1;
			}

			return 0;
		}

		fprintf(stderr, "--lockout_method missing an integer value\n");
		return -1;
	}

	if (!strcmp(key, "save"))
	{
		args->saveimg = 1;
		if (value_count == 1) args->saveimg = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "save_obstruct"))
	{
		args->save_obstruct_img = 1;
		if (value_count == 1) args->save_obstruct_img = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "new_execute"))
	{
		args->new_execute = 1;
		if (value_count == 1) args->new_execute = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "highlight"))
	{
		args->highlight_match = 1;
		if (value_count == 1) args->highlight_match = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "lockout"))
	{
		args->lockout_time = DEFAULT_LOCKOUT_TIME;
		if (value_count == 1) args->lockout_time = atoi(values[0]);

		return 0;
	}

	if (!strcmp(key, "lockout_error_delay"))
	{
		if (value_count == 1)
		{
			args->consecutive_lockout_delay = atof(values[0]);
			return 0;
		}

		fprintf(stderr, "--lockout_error_delay missing a seconds value\n");
		return -1;
	}

	if (!strcmp(key, "lockout_error"))
	{
		if (value_count == 1)
		{
			args->max_consecutive_lockout_count = atoi(values[0]);
			return 0;
		}

		fprintf(stderr, "--lockout_error missing a value\n");
		return -1;
	}

	if (!strcmp(key, "lockout_dummy"))
	{
		args->lockout_dummy = 1;
		if (value_count == 1) args->lockout_dummy = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "matchtime"))
	{
		args->match_time = DEFAULT_MATCH_WAIT;
		if (value_count == 1) args->match_time = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "no_final_decision"))
	{
		args->no_final_decision = 1;
		if (value_count == 1) args->no_final_decision = atoi(values[0]);
		return 0;
	}

	#ifdef WITH_ZMQ
	if (!strcmp(key, "zmq"))
	{
		args->zmq = 1;
		if (value_count == 1) args->zmq = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "zmq_port"))
	{
		args->zmq_port = DEFAULT_ZMQ_PORT;

		if (value_count < 1)
		{
			fprintf(stderr, "--zmq_port missing value\n");
			return -1;
		}

		args->zmq_port = atoi(values[0]);

		return 0;
	}

	if (!strcmp(key, "zmq_iface"))
	{
		if (value_count < 1)
		{
			fprintf(stderr, "--zmq_iface missing interface name\n");
			return -1;
		}

		args->zmq_iface = values[0];

		return 0;
	}

	if (!strcmp(key, "zmq_transport"))
	{
		if (value_count != 1)
		{
			fprintf(stderr, "--zmq_transport missing value\n");
			return -1;
		}

		args->zmq_transport = values[0];

		return 0;
	}
	#endif // WITH_ZMQ

	if (!strcmp(key, "output") || !strcmp(key, "output_path"))
	{
		if (value_count == 1)
		{
			args->output_path = values[0];
			return 0;
		}

		fprintf(stderr, "--output_path missing path value\n");
		return -1;
	}

	if (!strcmp(key, "match_output_path"))
	{
		if (value_count == 1)
		{
			args->match_output_path = values[0];
			return 0;
		}

		fprintf(stderr, "--match_output_path missing path value\n");
		return -1;
	}

	if (!strcmp(key, "steps_output_path"))
	{
		if (value_count == 1)
		{
			args->steps_output_path = values[0];
			return 0;
		}

		fprintf(stderr, "--steps_output_path missing path value\n");
		return -1;
	}

	if (!strcmp(key, "obstruct_output_path"))
	{
		if (value_count == 1)
		{
			args->obstruct_output_path = values[0];
			return 0;
		}

		fprintf(stderr, "--obstruct_output_path missing path value\n");
		return -1;
	}

	if (!strcmp(key, "template_output_path"))
	{
		if (value_count == 1)
		{
			args->template_output_path = values[0];
			return 0;
		}

		fprintf(stderr, "--template_output_path missing path value\n");
		return -1;
	}

	if (!strcmp(key, "input") || !strcmp(key, "template"))
	{
		if (value_count == 0)
		{
			fprintf(stderr, "--template missing value\n");
			return -1;
		}

		for (i = 0; i < value_count; i++)
		{
			if (args->input_count >= MAX_INPUT_TEMPLATES)
			{
				fprintf(stderr, "Max template input reached %d\n", MAX_INPUT_TEMPLATES);
				return -1;
			}
			args->inputs[args->input_count] = values[i];
			args->input_count++;
		}

		return 0;
	}

	#ifdef WITH_RFID
	if (!strcmp(key, "rfid_in"))
	{
		if (value_count == 1)
		{
			args->rfid_inner_path = values[0];
			return 0;
		}

		fprintf(stderr, "--rfid_in missing path value\n");
		return -1;
	}

	if (!strcmp(key, "rfid_out"))
	{
		if (value_count == 1)
		{
			args->rfid_outer_path = values[0];
			return 0;
		}

		fprintf(stderr, "--rfid_out missing path value\n");
		return -1;
	}

	if (!strcmp(key, "rfid_allowed"))
	{
		if (value_count == 1)
		{
			if (catcierge_create_rfid_allowed_list(args, values[0]))
			{
				CATERR("Failed to create RFID allowed list\n");
				return -1;
			}

			return 0;
		}

		fprintf(stderr, "--rfid_allowed missing comma separated list of values\n");
		return -1;
	}

	if (!strcmp(key, "rfid_time"))
	{
		if (value_count == 1)
		{
			args->rfid_lock_time = (double)atof(values[0]);
			return 0;
		}

		fprintf(stderr, "--rfid_time missing seconds value (float)\n");
		return -1;
	}

	if (!strcmp(key, "rfid_lock"))
	{
		args->lock_on_invalid_rfid = 1;
		if (value_count == 1) args->lock_on_invalid_rfid = atoi(values[0]);
		return 0;
	}
	#endif // WITH_RFID

	if (!strcmp(key, "log"))
	{
		if (value_count == 1)
		{
			args->log_path = values[0];
			return 0;
		}

		fprintf(stderr, "--log missing path value\n");
		return -1;
	}

	if (!strcmp(key, "match_cmd"))
	{
		if (value_count == 1)
		{
			args->match_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--match_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "save_img_cmd"))
	{
		if (value_count == 1)
		{
			args->save_img_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--save_img_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "frame_obstructed_cmd"))
	{
		if (value_count == 1)
		{
			args->frame_obstructed_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--frame_obstructed_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "save_imgs_cmd") || !strcmp(key, "match_group_done_cmd"))
	{
		if (value_count == 1)
		{
			args->match_group_done_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--match_group_done_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "match_done_cmd"))
	{
		if (value_count == 1)
		{
			args->match_done_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--match_done_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "do_lockout_cmd"))
	{
		if (value_count == 1)
		{
			args->do_lockout_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--do_lockout_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "do_unlock_cmd"))
	{
		if (value_count == 1)
		{
			args->do_unlock_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--do_unlock cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "state_change_cmd"))
	{
		if (value_count == 1)
		{
			args->state_change_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--state_change_cmd cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "nocolor"))
	{
		args->nocolor = 1;
		if (value_count == 1) args->nocolor = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "noanim"))
	{
		args->noanim = 1;
		if (value_count == 1) args->noanim = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "save_steps"))
	{
		args->save_steps = 1;
		if (value_count == 1) args->save_steps = atoi(values[0]);
		return 0;
	}

	if (!strcmp(key, "chuid"))
	{
		if (value_count == 1)
		{
			args->chuid = values[0];
			return 0;
		}

		fprintf(stderr, "--chuid missing value\n");
		return -1;
	}

	#ifdef WITH_RFID
	if (!strcmp(key, "rfid_detect_cmd"))
	{
		if (value_count == 1)
		{
			args->rfid_detect_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--rfid_detect_cmd missing value\n");
		return -1;
	}

	if (!strcmp(key, "rfid_match_cmd"))
	{
		if (value_count == 1)
		{
			args->rfid_match_cmd = values[0];
			return 0;
		}

		fprintf(stderr, "--rfid_match_cmd missing value\n");
		return -1;
	}
	#endif // WITH_RFID

	#ifndef _WIN32
	// TODO: Support this on windows.
	if (!strcmp(key, "base_time"))
	{
		if (value_count == 1)
		{
			struct tm base_time_tm;
			time_t base_time_t;
			struct timeval base_time_now;
			long base_time_diff;

			memset(&base_time_tm, 0, sizeof(base_time_tm));
			memset(&base_time_now, 0, sizeof(base_time_now));

			args->base_time = values[0];

			if (!strptime(args->base_time, "%Y-%m-%dT%H:%M:%S", &base_time_tm))
			{
				goto fail_base_time;
			}

			if ((base_time_t = mktime(&base_time_tm)) == -1)
			{
				goto fail_base_time;
			}

			gettimeofday(&base_time_now, NULL);
			base_time_diff = base_time_now.tv_sec - base_time_t;

			catcierge_strftime_set_base_diff(base_time_diff);

			return 0;

		fail_base_time:
			fprintf(stderr, "Failed to parse --base_time %s\n", values[0]);
			return -1;
		}

		fprintf(stderr, "--base_time missing value\n");
		return -1;
	}
	#endif // _WIN32

	#ifdef RPI
	if (!strncmp(key, "rpi-", 4))
	{
		int rpiret = 0;
		const char *rpikey = key + strlen("rpi");

		if (!raspicamcontrol_parse_cmdline(&args->rpi_settings.camera_parameters,
			rpikey, (value_count == 1) ? values[0] : NULL))
		{
			return -1;
		}
		return 0;
	}
	#endif // RPI

	return -1;
}