blob: 82301f91b5f973d81d8b3176b9b289d39ca72ed1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <string.h>
#include <errno.h>
#include "os/mynewt.h"
#if MYNEWT_VAL(LP5523_CLI)
#include "console/console.h"
#include "shell/shell.h"
#include "hal/hal_gpio.h"
#include "lp5523/lp5523.h"
#include "parse/parse.h"
static int lp5523_shell_cmd(int argc, char **argv);
static struct shell_cmd lp5523_shell_cmd_struct = {
.sc_cmd = "lp5523",
.sc_cmd_func = lp5523_shell_cmd
};
static struct led_itf lp5523_itf = {
.li_type = MYNEWT_VAL(LP5523_SHELL_ITF_TYPE),
.li_num = MYNEWT_VAL(LP5523_SHELL_ITF_NUM),
.li_addr = MYNEWT_VAL(LP5523_SHELL_ITF_ADDR)
};
static int
lp5523_shell_err_too_few_args(char *cmd_name)
{
console_printf("Error: too few arguments for command \"%s\"\n",
cmd_name);
return EINVAL;
}
static int
lp5523_shell_err_too_many_args(char *cmd_name)
{
console_printf("Error: too many arguments for command \"%s\"\n",
cmd_name);
return EINVAL;
}
static int
lp5523_shell_err_unknown_arg(char *cmd_name)
{
console_printf("Error: unknown argument \"%s\"\n",
cmd_name);
return EINVAL;
}
static int
lp5523_shell_err_invalid_arg(char *cmd_name)
{
console_printf("Error: invalid argument \"%s\"\n",
cmd_name);
return EINVAL;
}
static int
lp5523_shell_help(void)
{
console_printf("%s cmd [flags...]\n", lp5523_shell_cmd_struct.sc_cmd);
console_printf("cmd:\n");
console_printf("\treset\n");
console_printf("\tenable\t[output]\n");
console_printf("\tdisable\t[output]\n");
console_printf("\tpwm\t[output | value]\n");
console_printf("\tins\t[XXX]\n");
return 0;
}
static int
lp5523_shell_cmd_reset(int argc, char **argv)
{
return lp5523_reset(&lp5523_itf);
}
static int
lp5523_shell_cmd_enable(int argc, char **argv)
{
return lp5523_set_enable(&lp5523_itf, 1);
}
static int
lp5523_shell_cmd_disable(int argc, char **argv)
{
return lp5523_set_enable(&lp5523_itf, 0);
}
static int
lp5523_shell_cmd_pwm(int argc, char **argv)
{
int rc;
uint8_t output;
uint8_t value;
if (argc > 4) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 4) {
return lp5523_shell_err_too_few_args(argv[1]);
}
output = parse_ll_bounds(argv[2], 1, 9, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
value = parse_ll_bounds(argv[3], 0, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[3]);
}
return lp5523_set_output_reg(&lp5523_itf, LP5523_PWM, output, value);
}
static int
lp5523_shell_cmd_ins_ramp(int argc, char **argv, uint8_t addr)
{
int rc;
int snoi;
uint8_t prescale;
uint8_t step_time;
uint8_t sign;
uint8_t noi;
if (argc > 8) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 8) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[4], "im") == 0) {
prescale = parse_ll_bounds(argv[5], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
step_time = parse_ll_bounds(argv[6], 0, 31, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
snoi = parse_ll_bounds(argv[7], -255, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[7]);
}
if (snoi < 0) {
sign = 1;
noi = (uint8_t)-snoi;
} else {
sign = 0;
noi = (uint8_t)snoi;
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_RAMP_IM(prescale, step_time, sign, noi));
}
prescale = parse_ll_bounds(argv[4], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
step_time = parse_ll_bounds(argv[5], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
sign = parse_ll_bounds(argv[6], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
noi = parse_ll_bounds(argv[7], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[7]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_RAMP(prescale, step_time, sign, noi));
}
static int
lp5523_shell_cmd_ins_pwm(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t pwm;
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 5) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[4], "im") == 0) {
if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
pwm = parse_ll_bounds(argv[5], 0, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
return lp5523_set_instruction(&lp5523_itf, addr, LP5523_INS_SET_PWM_IM(pwm));
}
if (argc > 5) {
return lp5523_shell_err_too_many_args(argv[1]);
}
pwm = parse_ll_bounds(argv[4], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
return lp5523_set_instruction(&lp5523_itf, addr, LP5523_INS_SET_PWM(pwm));
}
static int
lp5523_shell_cmd_ins_wait(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t prescale;
uint8_t step_time;
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
prescale = parse_ll_bounds(argv[4], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
step_time = parse_ll_bounds(argv[5], 0, 31, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
return lp5523_set_instruction(&lp5523_itf, addr, LP5523_INS_WAIT(prescale,
step_time));
}
static int
lp5523_shell_cmd_ins_mux_addr(int argc, char **argv, uint8_t *addr)
{
int rc;
if (argc < 7) {
return lp5523_shell_err_too_few_args(argv[1]);
}
*addr = parse_ll_bounds(argv[6], 0, 95, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
return 0;
}
static int
lp5523_shell_cmd_ins_mux(int argc, char **argv, uint8_t addr)
{
int rc;
if (argc > 7) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 5) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[4], "ld") == 0) {
if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[5], "start") == 0) {
uint8_t addr;
rc = lp5523_shell_cmd_ins_mux_addr(argc, argv, &addr);
if (rc != 0) {
return rc;
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_LD_START(addr));
}
if (strcmp(argv[5], "end") == 0) {
uint8_t addr;
rc = lp5523_shell_cmd_ins_mux_addr(argc, argv, &addr);
if (rc != 0) {
return rc;
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_LD_END(addr));
}
if (strcmp(argv[5], "addr") == 0) {
uint8_t addr;
rc = lp5523_shell_cmd_ins_mux_addr(argc, argv, &addr);
if (rc != 0) {
return rc;
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_LD_ADDR(addr));
}
if (strcmp(argv[5], "next") == 0) {
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_LD_NEXT());
}
if (strcmp(argv[5], "prev") == 0) {
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_LD_PREV());
}
return lp5523_shell_err_invalid_arg(argv[5]);
}
if (strcmp(argv[4], "map") == 0) {
if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[5], "start") == 0) {
uint8_t addr;
rc = lp5523_shell_cmd_ins_mux_addr(argc, argv, &addr);
if (rc != 0) {
return rc;
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_MAP_START(addr));
}
if (strcmp(argv[5], "addr") == 0) {
uint8_t addr;
rc = lp5523_shell_cmd_ins_mux_addr(argc, argv, &addr);
if (rc != 0) {
return rc;
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_MAP_ADDR(addr));
}
if (strcmp(argv[5], "next") == 0) {
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_MAP_NEXT());
}
if (strcmp(argv[5], "prev") == 0) {
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_MAP_PREV());
}
return lp5523_shell_err_invalid_arg(argv[5]);
}
if (strcmp(argv[4], "sel") == 0) {
uint8_t sel;
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
sel = parse_ll_bounds(argv[5], 0, 127, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_MUX_SEL(sel));
}
if (strcmp(argv[4], "clr") == 0) {
if (argc > 5) {
return lp5523_shell_err_too_many_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr, LP5523_INS_MUX_CLR());
}
return lp5523_shell_err_invalid_arg(argv[4]);
}
static int
lp5523_shell_cmd_ins_rst(int argc, char **argv, uint8_t addr)
{
if (argc > 4) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 4) {
return lp5523_shell_err_too_few_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr, LP5523_INS_RST());
}
static int
lp5523_shell_cmd_ins_branch(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t loop_count;
uint8_t step_number;
if (argc > 7) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[4], "im") == 0) {
if (argc < 7) {
return lp5523_shell_err_too_few_args(argv[1]);
}
loop_count = parse_ll_bounds(argv[5], 0, 63, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
step_number = parse_ll_bounds(argv[6], 0, 95, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_BRANCH_IM(loop_count, step_number));
}
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
}
step_number = parse_ll_bounds(argv[4], 0, 95, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
loop_count = parse_ll_bounds(argv[5], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_BRANCH(step_number, loop_count));
}
static int
lp5523_shell_cmd_ins_int(int argc, char **argv, uint8_t addr)
{
if (argc > 3) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 3) {
return lp5523_shell_err_too_few_args(argv[1]);
}
return lp5523_set_instruction(&lp5523_itf, addr, LP5523_INS_INT());
}
static int
lp5523_shell_cmd_ins_end(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t interrupt;
uint8_t reset;
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
interrupt = parse_ll_bounds(argv[4], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
reset = parse_ll_bounds(argv[5], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_END(interrupt, reset));
}
static int
lp5523_shell_cmd_ins_trigger(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t wait_external;
uint8_t wait_engines;
uint8_t send_external;
uint8_t send_engines;
if (argc > 8) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 8) {
return lp5523_shell_err_too_few_args(argv[1]);
}
wait_external = parse_ll_bounds(argv[4], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
wait_engines = parse_ll_bounds(argv[5], 0, 7, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
send_external = parse_ll_bounds(argv[6], 0, 1, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
send_engines = parse_ll_bounds(argv[7], 0, 7, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[7]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_TRIGGER(wait_external, wait_engines, send_external,
send_engines));
}
static int
lp5523_shell_cmd_ins_j(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t skip;
uint8_t variable1;
uint8_t variable2;
if (argc > 7) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 7) {
return lp5523_shell_err_too_few_args(argv[1]);
}
skip = parse_ll_bounds(argv[4], 0, 31, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
variable1 = parse_ll_bounds(argv[5], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
variable2 = parse_ll_bounds(argv[6], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
if (strcmp(argv[3], "jne") == 0) {
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_JNE(skip, variable1, variable2));
}
if (strcmp(argv[3], "jl") == 0) {
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_JL(skip, variable1, variable2));
}
if (strcmp(argv[3], "jge") == 0) {
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_JGE(skip, variable1, variable2));
}
if (strcmp(argv[3], "je") == 0) {
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_JE(skip, variable1, variable2));
}
return lp5523_shell_err_invalid_arg(argv[3]);
}
static int
lp5523_shell_cmd_ins_ld(int argc, char **argv, uint8_t addr)
{
int rc;
uint8_t target;
uint8_t value;
if (argc > 6) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 6) {
return lp5523_shell_err_too_few_args(argv[1]);
}
target = parse_ll_bounds(argv[4], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
value = parse_ll_bounds(argv[5], 0, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
return lp5523_set_instruction(&lp5523_itf, addr,
LP5523_INS_LD(target, value));
}
static int
lp5523_shell_cmd_ins_add_sub(int argc, char **argv, uint8_t addr, uint8_t sub)
{
int rc;
uint8_t target;
uint8_t variable1;
uint8_t variable2;
if (argc > 7) {
return lp5523_shell_err_too_many_args(argv[1]);
} else if (argc < 7) {
return lp5523_shell_err_too_few_args(argv[1]);
}
if (strcmp(argv[4], "im") == 0) {
target = parse_ll_bounds(argv[5], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
variable1 = parse_ll_bounds(argv[6], 0, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
return lp5523_set_instruction(&lp5523_itf, addr, (sub != 0) ?
LP5523_INS_SUB_IM(target, variable1) :
LP5523_INS_ADD_IM(target, variable1));
}
target = parse_ll_bounds(argv[4], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[4]);
}
variable1 = parse_ll_bounds(argv[5], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[5]);
}
variable2 = parse_ll_bounds(argv[6], 0, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[6]);
}
return lp5523_set_instruction(&lp5523_itf, addr, (sub != 0) ?
LP5523_INS_SUB(target, variable1, variable2) :
LP5523_INS_ADD(target, variable1, variable2));
}
static int
lp5523_shell_cmd_ins_add(int argc, char **argv, uint8_t addr)
{
return lp5523_shell_cmd_ins_add_sub(argc, argv, addr, 0);
}
static int
lp5523_shell_cmd_ins_sub(int argc, char **argv, uint8_t addr)
{
return lp5523_shell_cmd_ins_add_sub(argc, argv, addr, 1);
}
static int
lp5523_shell_cmd_ins(int argc, char **argv)
{
int rc;
uint8_t addr;
if (argc < 4) {
return lp5523_shell_err_too_few_args(argv[1]);
}
/* get addr */
addr = parse_ll_bounds(argv[2], 0, 95, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
if (strcmp(argv[3], "ramp") == 0) {
return lp5523_shell_cmd_ins_ramp(argc, argv, addr);
}
if (strcmp(argv[3], "pwm") == 0) {
return lp5523_shell_cmd_ins_pwm(argc, argv, addr);
}
if (strcmp(argv[3], "wait") == 0) {
return lp5523_shell_cmd_ins_wait(argc, argv, addr);
}
if (strcmp(argv[3], "mux") == 0) {
return lp5523_shell_cmd_ins_mux(argc, argv, addr);
}
if (strcmp(argv[3], "rst") == 0) {
return lp5523_shell_cmd_ins_rst(argc, argv, addr);
}
if (strcmp(argv[3], "branch") == 0) {
return lp5523_shell_cmd_ins_branch(argc, argv, addr);
}
if (strcmp(argv[3], "int") == 0) {
return lp5523_shell_cmd_ins_int(argc, argv, addr);
}
if (strcmp(argv[3], "end") == 0) {
return lp5523_shell_cmd_ins_end(argc, argv, addr);
}
if (strcmp(argv[3], "trigger") == 0) {
return lp5523_shell_cmd_ins_trigger(argc, argv, addr);
}
if (argv[3][0] == 'j') {
return lp5523_shell_cmd_ins_j(argc, argv, addr);
}
if (strcmp(argv[3], "ld") == 0) {
return lp5523_shell_cmd_ins_ld(argc, argv, addr);
}
if (strcmp(argv[3], "add") == 0) {
return lp5523_shell_cmd_ins_add(argc, argv, addr);
}
if (strcmp(argv[3], "sub") == 0) {
return lp5523_shell_cmd_ins_sub(argc, argv, addr);
}
return lp5523_shell_err_unknown_arg(argv[2]);
}
static int
lp5523_shell_cmd_start(int argc, char **argv)
{
int rc;
uint8_t engine;
uint8_t addr;
if (argc < 4) {
return lp5523_shell_err_too_few_args(argv[1]);
} else if (argc > 5) {
return lp5523_shell_err_too_many_args(argv[1]);
}
/* set start address for engine */
engine = parse_ll_bounds(argv[2], 1, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
addr = parse_ll_bounds(argv[3], 0, 95, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[3]);
}
return lp5523_set_engine_reg(&lp5523_itf,
LP5523_ENG_PROG_START_ADDR, engine, addr);
}
static int
lp5523_shell_cmd_load(int argc, char **argv)
{
int rc;
uint8_t engine;
uint8_t engines;
if (argc < 3) {
return lp5523_shell_err_too_few_args(argv[1]);
} else if (argc > 3) {
return lp5523_shell_err_too_many_args(argv[1]);
}
/* engine to load mode */
engine = parse_ll_bounds(argv[2], 1, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
engines = 3 << ((3 - engine) << 1);
/* disable engines */
rc = lp5523_set_engine_control(&lp5523_itf, LP5523_ENGINE_CNTRL2, engines,
LP5523_ENGINES_DISABLED);
if (rc != 0) {
return rc;
}
/* put engines into load program state */
return lp5523_set_engine_control(&lp5523_itf, LP5523_ENGINE_CNTRL2, engines,
LP5523_ENGINES_LOAD_PROGRAM);
}
static int
lp5523_shell_cmd_run(int argc, char **argv)
{
int rc;
uint8_t engine;
if (argc < 3) {
return lp5523_shell_err_too_few_args(argv[1]);
} else if (argc > 3) {
return lp5523_shell_err_too_many_args(argv[1]);
}
/* engine run */
engine = parse_ll_bounds(argv[2], 1, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
return lp5523_engines_run(&lp5523_itf, 3 << ((3 - engine) << 1));
}
static int
lp5523_shell_cmd_hold(int argc, char **argv)
{
int rc;
uint8_t engine;
if (argc < 3) {
return lp5523_shell_err_too_few_args(argv[1]);
} else if (argc > 3) {
return lp5523_shell_err_too_many_args(argv[1]);
}
/* engine hold */
engine = parse_ll_bounds(argv[2], 1, 3, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
return lp5523_engines_hold(&lp5523_itf, 3 << ((3 - engine) << 1));
}
static int
lp5523_shell_cmd_dump(int argc, char **argv)
{
int rc;
uint8_t i;
uint16_t ins;
if (argc < 2) {
return lp5523_shell_err_too_few_args(argv[1]);
} else if (argc > 2) {
return lp5523_shell_err_too_many_args(argv[1]);
}
i = 0;
while (i < LP5523_MEMORY_SIZE) {
rc = lp5523_get_instruction(&lp5523_itf, i, &ins);
if (rc != 0) {
return -1;
}
console_printf("%02x: %04x\r\n", i, ins);
++i;
}
return 0;
}
static int
lp5523_shell_cmd_reg(int argc, char **argv)
{
int rc;
uint8_t addr;
uint8_t value;
if (argc < 3) {
return lp5523_shell_err_too_few_args(argv[1]);
} else if (argc > 4) {
return lp5523_shell_err_too_many_args(argv[1]);
}
addr = parse_ll_bounds(argv[2], 0, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[2]);
}
if (strcmp(argv[2], "set") == 0) {
if (argc < 4) {
return lp5523_shell_err_too_few_args(argv[1]);
}
value = parse_ll_bounds(argv[3], 0, 255, &rc);
if (rc != 0) {
return lp5523_shell_err_invalid_arg(argv[3]);
}
return lp5523_set_reg(&lp5523_itf, addr, value);
}
if (argc > 3) {
return lp5523_shell_err_too_many_args(argv[1]);
}
rc = lp5523_get_reg(&lp5523_itf, addr, &value);
if (rc != 0) {
return rc;
}
console_printf("%02x\r\n", value);
return rc;
}
static int
lp5523_shell_cmd(int argc, char **argv)
{
if (argc == 1) {
return lp5523_shell_help();
}
if (argc < 1) {
return lp5523_shell_err_too_few_args(argv[1]);
}
/* Reset */
if (strcmp(argv[1], "reset") == 0) {
return lp5523_shell_cmd_reset(argc, argv);
}
/* Enables the device or an output */
if (strcmp(argv[1], "enable") == 0) {
return lp5523_shell_cmd_enable(argc, argv);
}
/* Disables the device or an output */
if (strcmp(argv[1], "disable") == 0) {
return lp5523_shell_cmd_disable(argc, argv);
}
/* Sets the PWM duty cycle of an output LED */
if (strcmp(argv[1], "pwm") == 0) {
return lp5523_shell_cmd_pwm(argc, argv);
}
/* Writes an instruction */
if (strcmp(argv[1], "ins") == 0) {
return lp5523_shell_cmd_ins(argc, argv);
}
/* Sets program start */
if (strcmp(argv[1], "start") == 0) {
return lp5523_shell_cmd_start(argc, argv);
}
/* Sets engines into load program mode */
if (strcmp(argv[1], "load") == 0) {
return lp5523_shell_cmd_load(argc, argv);
}
/* Runs program */
if (strcmp(argv[1], "run") == 0) {
return lp5523_shell_cmd_run(argc, argv);
}
/* Holds program */
if (strcmp(argv[1], "hold") == 0) {
return lp5523_shell_cmd_hold(argc, argv);
}
/* dumps program */
if (strcmp(argv[1], "dump") == 0) {
return lp5523_shell_cmd_dump(argc, argv);
}
if (strcmp(argv[1], "reg") == 0) {
return lp5523_shell_cmd_reg(argc, argv);
}
return lp5523_shell_err_unknown_arg(argv[1]);
}
int
lp5523_shell_init(void)
{
int rc;
rc = shell_cmd_register(&lp5523_shell_cmd_struct);
return rc;
}
#endif