aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--klippy/extras/neopixel.py11
-rw-r--r--src/neopixel.c23
2 files changed, 23 insertions, 11 deletions
diff --git a/klippy/extras/neopixel.py b/klippy/extras/neopixel.py
index 320435c5..fd473987 100644
--- a/klippy/extras/neopixel.py
+++ b/klippy/extras/neopixel.py
@@ -6,6 +6,9 @@
BACKGROUND_PRIORITY_CLOCK = 0x7fffffff00000000
+BIT_MAX_TIME=.000004
+RESET_MIN_TIME=.000050
+
class PrinterNeoPixel:
def __init__(self, config):
self.printer = config.get_printer()
@@ -15,8 +18,7 @@ class PrinterNeoPixel:
pin_params = ppins.lookup_pin(config.get('pin'))
self.mcu = pin_params['chip']
self.oid = self.mcu.create_oid()
- self.mcu.add_config_cmd("config_neopixel oid=%d pin=%s"
- % (self.oid, pin_params['pin']))
+ self.pin = pin_params['pin']
self.mcu.register_config_callback(self.build_config)
self.color_order_GRB = config.getboolean("color_order_GRB", True)
self.chain_count = config.getint('chain_count', 1, minval=1, maxval=18)
@@ -33,6 +35,11 @@ class PrinterNeoPixel:
self.cmd_SET_LED,
desc=self.cmd_SET_LED_help)
def build_config(self):
+ bmt = self.mcu.seconds_to_clock(BIT_MAX_TIME)
+ rmt = self.mcu.seconds_to_clock(RESET_MIN_TIME)
+ self.mcu.add_config_cmd("config_neopixel oid=%d pin=%s"
+ " bit_max_ticks=%d reset_min_ticks=%d"
+ % (self.oid, self.pin, bmt, rmt))
cmd_queue = self.mcu.alloc_command_queue()
self.neopixel_send_cmd = self.mcu.lookup_command(
"neopixel_send oid=%c data=%*s", cq=cmd_queue)
diff --git a/src/neopixel.c b/src/neopixel.c
index 5988562b..f7e961fc 100644
--- a/src/neopixel.c
+++ b/src/neopixel.c
@@ -78,8 +78,6 @@ neopixel_delay(neopixel_time_t start, neopixel_time_t ticks)
#define PULSE_LONG_TICKS nsecs_to_ticks(650)
#define PULSE_SHORT_TICKS nsecs_to_ticks(200)
#define BIT_MIN_TICKS nsecs_to_ticks(1250)
-#define BIT_MAX_TICKS nsecs_to_ticks(4000)
-#define RESET_MIN_TICKS timer_from_us(50)
/****************************************************************
@@ -88,7 +86,8 @@ neopixel_delay(neopixel_time_t start, neopixel_time_t ticks)
struct neopixel_s {
struct gpio_out pin;
- uint32_t last_req_time;
+ neopixel_time_t bit_max_ticks;
+ uint32_t last_req_time, reset_min_ticks;
};
void
@@ -98,21 +97,27 @@ command_config_neopixel(uint32_t *args)
struct neopixel_s *n = oid_alloc(args[0], command_config_neopixel
, sizeof(*n));
n->pin = pin;
+ n->bit_max_ticks = args[2];
+ n->reset_min_ticks = args[3];
}
-DECL_COMMAND(command_config_neopixel, "config_neopixel oid=%c pin=%u");
+DECL_COMMAND(command_config_neopixel, "config_neopixel oid=%c pin=%u"
+ " bit_max_ticks=%u reset_min_ticks=%u");
static int
send_data(struct neopixel_s *n, uint8_t *data, uint_fast8_t data_len)
{
- // Make sure at least 50us has passed since last request
- uint32_t last_req_time = n->last_req_time, cur = timer_read_time();
- while (cur - last_req_time < RESET_MIN_TICKS) {
+ // Make sure the reset time has elapsed since last request
+ uint32_t last_req_time = n->last_req_time, rmt = n->reset_min_ticks;
+ uint32_t cur = timer_read_time();
+ while (cur - last_req_time < rmt) {
irq_poll();
cur = timer_read_time();
}
+ // Transmit data
struct gpio_out pin = n->pin;
neopixel_time_t last_start = neopixel_get_time();
+ neopixel_time_t bit_max_ticks = n->bit_max_ticks;
while (data_len--) {
uint_fast8_t byte = *data++;
uint_fast8_t bits = 8;
@@ -125,7 +130,7 @@ send_data(struct neopixel_s *n, uint8_t *data, uint_fast8_t data_len)
gpio_out_toggle_noirq(pin);
irq_enable();
- if (neopixel_check_elapsed(last_start, start, BIT_MAX_TICKS))
+ if (neopixel_check_elapsed(last_start, start, bit_max_ticks))
goto fail;
last_start = start;
byte <<= 1;
@@ -144,7 +149,7 @@ send_data(struct neopixel_s *n, uint8_t *data, uint_fast8_t data_len)
gpio_out_toggle_noirq(pin);
irq_enable();
- if (neopixel_check_elapsed(last_start, start, BIT_MAX_TICKS))
+ if (neopixel_check_elapsed(last_start, start, bit_max_ticks))
goto fail;
last_start = start;
byte <<= 1;