--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <hal/hal-device-board.h>
+
+#include "board-params-setter.h"
+#include "board-params-util.h"
+
+#define BOARD_PARAM_PARAMS_LEN 3
+
+struct board_param_setter {
+ char *param_name;
+ char *description;
+ int (*setter)(char **params, size_t params_len);
+};
+
+static int partition_ab_setter(char **params, size_t params_len)
+{
+ assert(params != NULL);
+
+ if (params_len != 1)
+ return -EINVAL;
+
+ if (strncmp(params[0], "toggle", sizeof("toggle")) == 0)
+ return hal_device_board_switch_partition('\0');
+
+ char partition_ab = params[0][0];
+
+ return hal_device_board_switch_partition(partition_ab);
+}
+
+static int partition_ab_cloned_setter(char **params, size_t params_len)
+{
+ assert(params != NULL);
+
+ if (params_len != 1)
+ return -EINVAL;
+
+ if (strncmp(params[0], "0", sizeof("0")) == 0)
+ return hal_device_board_clear_partition_ab_cloned();
+
+ if (strncmp(params[0], "1", sizeof("1")) == 0)
+ return hal_device_board_set_partition_ab_cloned();
+
+ return -EINVAL;
+}
+
+static int partition_status_setter(char **params, size_t params_len)
+{
+ assert(params != NULL);
+
+ if (params_len != 2)
+ return -EINVAL;
+
+ char partition_ab = params[0][0];
+ char *status = params[1];
+
+ return hal_device_board_set_partition_status(partition_ab, status);
+}
+
+static int upgrade_progress_status_setter(char **params, size_t params_len)
+{
+ assert(params != NULL);
+
+ if (params_len != 1)
+ return -EINVAL;
+
+ int upgrade_progress_status = 0;
+
+ if (parse_integer(params[0], &upgrade_progress_status) < 0)
+ return -EINVAL;
+
+ return hal_device_board_set_upgrade_progress_status(upgrade_progress_status);
+}
+
+static int upgrade_type_setter(char **params, size_t params_len)
+{
+ assert(params != NULL);
+
+ if (params_len != 1)
+ return -EINVAL;
+
+ char *upgrade_type = params[0];
+
+ return hal_device_board_set_upgrade_type(upgrade_type);
+}
+
+static int upgrade_state_setter(char **params, size_t params_len)
+{
+ assert(params != NULL);
+
+ if (params_len != 2)
+ return -EINVAL;
+
+ char *state_from = params[0];
+ char *state_to = params[1];
+
+ return hal_device_board_set_upgrade_state(state_from, state_to);
+}
+
+static struct board_param_setter setters[] = {
+ {
+ .param_name = "partition-ab",
+ .description = "Switch partition between a/b. "
+ "1 param is required: <a, b or toggle>",
+ .setter = partition_ab_setter
+ }, {
+ .param_name = "partition-ab-cloned",
+ .description = "Set cloned flag 0 or 1. "
+ "1 param is required: <0 or 1>",
+ .setter = partition_ab_cloned_setter
+ }, {
+ .param_name = "partition-status",
+ .description = "Set partition status. "
+ "2 params are required: <a, b>,<ok, failed or corrupted>",
+ .setter = partition_status_setter
+ }, {
+ .param_name = "upgrade-progress-status",
+ .description = "Set upgrade progress status. 1 integer is requied: <-1 ~ 100>",
+ .setter = upgrade_progress_status_setter
+ }, {
+ .param_name = "upgrade-type",
+ .description = "Set upgrade type. 1 param is required: <online or offline>",
+ .setter = upgrade_type_setter
+ }, {
+ .param_name = "upgrade-state",
+ .description = "Set upgrade state. 2 params are required.",
+ .setter = upgrade_state_setter
+ }, {
+ /* sentinel for this array */
+ .param_name = NULL,
+ .description = NULL,
+ .setter = NULL
+ },
+};
+
+static int get_board_param_setter(const char *param_name, struct board_param_setter **board_param_setter)
+{
+ size_t param_name_len = strlen(param_name);
+
+ for (int i = 0; setters[i].param_name != NULL; ++i) {
+ if (strncmp(setters[i].param_name, param_name, param_name_len + 1) == 0) {
+ *board_param_setter = &setters[i];
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static void print_board_param_setters(void)
+{
+ printf("Available board params:\n");
+ for (int i = 0; setters[i].param_name != NULL; ++i) {
+ if (setters[i].setter == NULL)
+ continue;
+ printf(" %s: %s\n", setters[i].param_name, setters[i].description);
+ }
+
+ printf("\n"
+ " * Parameters should be provided separated with ','.\n"
+ " * e.g. \"upgrade_progress_status,100\"\n");
+}
+
+int do_set_board_param(const char *params_str)
+{
+ int ret = 0;
+ char *params_str_dup = NULL;
+ struct board_param_setter *board_param_setter = NULL;
+
+ char *params[BOARD_PARAM_PARAMS_LEN] = { NULL, };
+ size_t params_len = BOARD_PARAM_PARAMS_LEN;
+ char *param_name = NULL;
+
+ params_str_dup = strdup(params_str);
+ if (params_str_dup == NULL) {
+ printf("Failed to allocate memory for params.\n");
+ return 1;
+ }
+
+ params_len = split_params(params, params_len, ",", params_str_dup);
+ if (params_len < 1) {
+ printf("Invalid parameter.\n");
+ ret = -1;
+ goto release_and_exit;
+ }
+ param_name = params[0];
+
+ if (strncmp(param_name, "help", sizeof("help")) == 0) {
+ print_board_param_setters();
+ ret = 0;
+ goto release_and_exit;
+ }
+
+ ret = get_board_param_setter(param_name, &board_param_setter);
+ if (ret != 0) {
+ printf("Invalid parameter(s): %s\n", param_name);
+ print_board_param_setters();
+ goto release_and_exit;
+ }
+
+ ret = (board_param_setter->setter)(params + 1, params_len - 1);
+ if (ret != 0) {
+ printf("Failed to set board param %s: %d\n", param_name, ret);
+ printf("%s: %s\n", param_name, board_param_setter->description);
+ goto release_and_exit;
+ }
+
+ printf("Success\n");
+
+release_and_exit:
+ free(params_str_dup);
+
+ return ret;
+}
bool update;
bool online;
bool get_board_param;
+ bool set_board_param;
char *board_param;
};
args->update = false;
args->online = false;
args->get_board_param = false;
+ args->set_board_param = false;
args->board_param = NULL;
struct option long_options[] = {
{"offline-update", no_argument, NULL, 'f'},
{"online-update", no_argument, NULL, 'n'},
{"get-board-param", required_argument, NULL, 'g'},
+ {"set-board-param", required_argument, NULL, 's'},
{"help", no_argument, NULL, 'h'},
{}
};
args->board_param = optarg;
return 0;
}
+ case 's': {
+ args->set_board_param = true;
+ args->board_param = optarg;
+ return 0;
+ }
case 'h': {
args->help = true;
return 0;
" After that, performing the OS Upgrade will be impossible.\n"
" --get-board-param <param name>[,<param>...] Print value of a board param\n"
" Use <param name> as 'help' for details.\n"
+ " --set-board-param <param name>[,<param>...] Set value of a board param\n"
+ " Use <param name> as 'help' for details.\n"
"\n" ,my_name);
}
if (args.get_board_param)
return do_get_board_param(args.board_param);
+ if (args.set_board_param)
+ return do_set_board_param(args.board_param);
+
print_help(argv[0]);
return 1;