From 3c4d14bfa956ee586e9e61cbae34b0450aa5d760 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Wed, 11 Oct 2017 23:18:33 -0400 Subject: pca9685: Support default values Allow the pwm pin to have a non-zero default value. Signed-off-by: Kevin O'Connor --- src/linux/pca9685.c | 52 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/linux/pca9685.c b/src/linux/pca9685.c index 4c1611aa..386ad292 100644 --- a/src/linux/pca9685.c +++ b/src/linux/pca9685.c @@ -118,15 +118,6 @@ open_i2c(uint8_t bus, uint8_t addr, uint32_t cycle_ticks) return fd; } -void -pca9685_shutdown(void) -{ - int i; - for (i=0; ifd, p->channel, p->value); - if (!p->value || !p->max_duration) + if (p->value == p->default_value || !p->max_duration) return SF_DONE; p->timer.waketime += p->max_duration; p->timer.func = pca9685_end_event; @@ -163,18 +154,22 @@ pca9685_event(struct timer *timer) void command_config_pca9685(uint32_t *args) { - struct i2cpwm_s *p = oid_alloc(args[0], command_config_pca9685 - , sizeof(*p)); - uint8_t bus = args[1]; - uint8_t addr = args[2]; - p->channel = args[3]; - if (p->channel > CHANNEL_MAX) - shutdown("Invalid pca9685 channel"); - p->max_duration = args[5]; - p->fd = open_i2c(bus, addr, args[4]); + uint8_t bus = args[1], addr = args[2], channel = args[3]; + uint16_t value = args[5], default_value = args[6]; + if (channel > CHANNEL_MAX || value > VALUE_MAX || default_value > VALUE_MAX) + shutdown("Invalid pca9685 channel or value"); + int fd = open_i2c(bus, addr, args[4]); + if (value) + pca9685_write(fd, channel, value); + struct i2cpwm_s *p = oid_alloc(args[0], command_config_pca9685, sizeof(*p)); + p->fd = fd; + p->channel = channel; + p->default_value = default_value; + p->max_duration = args[7]; } DECL_COMMAND(command_config_pca9685, "config_pca9685 oid=%c bus=%c addr=%c" - " channel=%c cycle_ticks=%u max_duration=%u"); + " channel=%c cycle_ticks=%u value=%hu" + " default_value=%hu max_duration=%u"); void command_schedule_pca9685_out(uint32_t *args) @@ -203,3 +198,18 @@ command_set_pca9685_out(uint32_t *args) } DECL_COMMAND(command_set_pca9685_out, "set_pca9685_out bus=%c addr=%c" " channel=%c cycle_ticks=%u value=%hu"); + +void +pca9685_shutdown(void) +{ + int i; + for (i=0; idefault_value) + pca9685_write(p->fd, p->channel, p->default_value); + } +} +DECL_SHUTDOWN(pca9685_shutdown); -- cgit v1.2.3-70-g09d2