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; }
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; }