/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
* *
This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
* *
You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* *
Description:
*/

#include <common.h>
#include <command.h>
#include <vpp.h>

static int do_vpp_pq(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	short brightness, contrast, sat, hue;

	if (argc < 1) {
		printf("[vpp] pq val error !!!\n");
		return cmd_usage(cmdtp);
	}

	if (strcmp(argv[0], "pq") == 0) {
		if (argc == 5) {
			brightness = simple_strtol(argv[1], NULL, 10);
			contrast = simple_strtol(argv[2], NULL, 10);
			sat = simple_strtol(argv[3], NULL, 10);
			hue = simple_strtol(argv[4], NULL, 10);

			printf("[vpp] bri:%d, cont:%d,sat: %d, hue: %d\n",
				brightness, contrast, sat, hue);
			vpp_pq_init(brightness, contrast, sat, hue);
		} else {
			printf("[vpp]arg cnt  error: %x !!!\n", argc);
			return cmd_usage(cmdtp);
		}
	} else {
		printf("[vpp]arg val  error !!!\n");
		return cmd_usage(cmdtp);
	}

	return CMD_RET_SUCCESS;
}

static int do_hdr_packet(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{

	if (argc < 1) {
		printf("[vpp] hdr packet error !!!\n");
		return cmd_usage(cmdtp);
	}

	hdr_tx_pkt_cb();

	return CMD_RET_SUCCESS;
}

static cmd_tbl_t cmd_vpp_sub[] = {
	U_BOOT_CMD_MKENT(pq, 5, 1, do_vpp_pq, "", ""),
	U_BOOT_CMD_MKENT(hdrpkt, 1, 1, do_hdr_packet, "", ""),
};

static int do_vpp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	cmd_tbl_t *c;

	/* Strip off leading 'bmp' command argument */
	argc--;
	argv++;

	c = find_cmd_tbl(argv[0], &cmd_vpp_sub[0], ARRAY_SIZE(cmd_vpp_sub));

	if (c) {
		return c->cmd(cmdtp, flag, argc, argv);
	} else {
		cmd_usage(cmdtp);
		return 1;
	}
}

U_BOOT_CMD(vpp, CONFIG_SYS_MAXARGS, 0, do_vpp,
	"vpp sub-system",
	"osd+video pq value  brightness/contrast/saturation/hue parameters\n"
);
