Funkcni i pro ESP32-C3, modifikovane casovani, odstraneny mutex, opravena inicializace promennych
This commit is contained in:
parent
db3c9fa429
commit
0908cd9825
@ -1,4 +1,4 @@
|
||||
{
|
||||
"name": "WSLed",
|
||||
"version": "0.0.0+20210128092328"
|
||||
"version": "0.0.2"
|
||||
}
|
@ -24,16 +24,14 @@ License along with NeoPixel. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
-------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
|
||||
#include <Arduino.h>
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
# include <eagle_soc.h>
|
||||
# if (ARDUINO_ESP8266_MAJOR < 3)
|
||||
#include <eagle_soc.h>
|
||||
#if (ARDUINO_ESP8266_MAJOR < 3)
|
||||
# define INRAM ICACHE_RAM_ATTR
|
||||
# else
|
||||
#else
|
||||
# define INRAM IRAM_ATTR
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// ESP32 doesn't define ICACHE_RAM_ATTR
|
||||
@ -87,11 +85,7 @@ void INRAM send_pixels_800(uint8_t* pixels, size_t count, uint8_t pin)
|
||||
} while ((cyclesStart - cyclesNext) < CYCLES_800);
|
||||
|
||||
// set high
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
GPIO.out_w1ts = pinRegister;
|
||||
#else
|
||||
GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, pinRegister);
|
||||
#endif
|
||||
|
||||
// wait for the LOW
|
||||
do
|
||||
@ -100,11 +94,7 @@ void INRAM send_pixels_800(uint8_t* pixels, size_t count, uint8_t pin)
|
||||
} while ((cyclesNext - cyclesStart) < cyclesBit);
|
||||
|
||||
// set low
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
GPIO.out_w1tc = pinRegister;
|
||||
#else
|
||||
GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, pinRegister);
|
||||
#endif
|
||||
}
|
||||
} while (pixels < end);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Ovladani signalizacni chytre LED diody
|
||||
#include "wsLED.h"
|
||||
#include "wsLED.hpp"
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
//# include "esp_task.h"
|
||||
// https://github.com/JSchaenzle/ESP32-NeoPixel-WS2812-RMT/blob/master/ws2812_control.c
|
||||
@ -8,9 +8,10 @@
|
||||
# define LED_RMT_TX_CHANNEL RMT_CHANNEL_0
|
||||
# endif
|
||||
// These values are determined by measuring pulse timing with logic analyzer and adjusting to match datasheet.
|
||||
# define T0H 14 // 0 bit high time
|
||||
# define T1H 52 // 1 bit high time
|
||||
# define TL 52 // low time for either bit
|
||||
# define T0H 16 // 0 bit high time
|
||||
# define T1H 32 // 1 bit high time
|
||||
# define T0L 34 // 0 bit low time
|
||||
# define T1L 18 // 1 bit low time
|
||||
# define INRAM IRAM_ATTR
|
||||
#endif
|
||||
#if defined(ARDUINO_ARCH_ESP8266)
|
||||
@ -65,29 +66,30 @@ void wsLED::show(void)
|
||||
for (uint32_t bit = 0; bit < BITS_PER_LED_CMD; bit++) {
|
||||
uint32_t bit_is_set = bits_to_send & mask;
|
||||
|
||||
led_data_buffer[bit] = bit_is_set ? (rmt_item32_t) {{{T1H, 1, TL, 0}}} : (rmt_item32_t) {{{T0H, 1, TL, 0}}};
|
||||
led_data_buffer[bit] = bit_is_set ? (rmt_item32_t) {{{T1H, 1, T1L, 0}}} : (rmt_item32_t) {{{T0H, 1, T0L, 0}}};
|
||||
mask >>= 1;
|
||||
}
|
||||
ESP_ERROR_CHECK(rmt_write_items(LED_RMT_TX_CHANNEL, led_data_buffer, LED_BUFFER_ITEMS, false));
|
||||
// ESP_ERROR_CHECK(rmt_wait_tx_done(LED_RMT_TX_CHANNEL, portMAX_DELAY));
|
||||
_endtime = micros() + 100; // TODO: unfortunately this time is not valid for ESP32 using RMT peripheral
|
||||
#else
|
||||
noInterrupts();
|
||||
send_pixels_800(color, 1, _pin);
|
||||
interrupts();
|
||||
#endif
|
||||
_endtime = micros();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
wsLED::wsLED(int pin, int order)
|
||||
: _pin(pin)
|
||||
, _order(order)
|
||||
, _scale(0xff)
|
||||
, _ledState(LED_STOP)
|
||||
{}
|
||||
|
||||
wsLED::wsLED(void)
|
||||
: _pin(NOT_A_PIN)
|
||||
, _order(RGB)
|
||||
, _scale(0xff)
|
||||
, _ledState(LED_STOP)
|
||||
{}
|
||||
|
||||
@ -121,8 +123,6 @@ void wsLED::begin(void)
|
||||
|
||||
ESP_ERROR_CHECK(rmt_config(&config));
|
||||
ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));
|
||||
|
||||
_mutex = xSemaphoreCreateMutex();
|
||||
#endif
|
||||
_color[0] = _color[1] = _color[2] = 0;
|
||||
show();
|
||||
@ -141,9 +141,6 @@ void INRAM wsLED::rtLed(void)
|
||||
{
|
||||
uint32_t timing;
|
||||
|
||||
#if defined(ESP32)
|
||||
xSemaphoreTake(_mutex, portMAX_DELAY);
|
||||
#endif
|
||||
_handler.detach();
|
||||
switch (_ledState) {
|
||||
case LED_BLINK:
|
||||
@ -156,7 +153,6 @@ void INRAM wsLED::rtLed(void)
|
||||
timing = _blinkSpeed;
|
||||
break;
|
||||
|
||||
|
||||
case LED_BREATH: {
|
||||
++_subState;
|
||||
_subState %= countof(LB);
|
||||
@ -191,9 +187,6 @@ void INRAM wsLED::rtLed(void)
|
||||
}
|
||||
show();
|
||||
_handler.attach_ms(timing, ledTrampoline, this);
|
||||
#if defined(ESP32)
|
||||
xSemaphoreGive(_mutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
void wsLED::setColors(LEDRGB color1, LEDRGB color2)
|
||||
@ -211,18 +204,12 @@ void wsLED::blink(uint32_t speed)
|
||||
|
||||
if (NOT_A_PIN != _pin) {
|
||||
if (LED_BLINK != _ledState) {
|
||||
#if defined(ESP32)
|
||||
xSemaphoreTake(_mutex, portMAX_DELAY);
|
||||
#endif
|
||||
_handler.detach();
|
||||
_ledState = LED_BLINK;
|
||||
_scale = 0xff;
|
||||
_subState = 1;
|
||||
_blinkSpeed = speed;
|
||||
_handler.attach_ms(5, ledTrampoline, this);
|
||||
#if defined(ESP32)
|
||||
xSemaphoreGive(_mutex);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -232,17 +219,11 @@ void wsLED::breath(void)
|
||||
|
||||
if (NOT_A_PIN != _pin) {
|
||||
if (LED_BREATH != _ledState) {
|
||||
#if defined(ESP32)
|
||||
xSemaphoreTake(_mutex, portMAX_DELAY);
|
||||
#endif
|
||||
_handler.detach();
|
||||
_ledState = LED_BREATH;
|
||||
_subState = 0;
|
||||
setColor(_color1);
|
||||
_handler.attach_ms(5, ledTrampoline, this);
|
||||
#if defined(ESP32)
|
||||
xSemaphoreGive(_mutex);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -257,9 +238,6 @@ void wsLED::pulse(LEDRGB color, uint32_t duration)
|
||||
{
|
||||
|
||||
if (NOT_A_PIN != _pin) {
|
||||
#if defined(ESP32)
|
||||
xSemaphoreTake(_mutex, portMAX_DELAY);
|
||||
#endif
|
||||
_handler.detach();
|
||||
_scale = 0xff;
|
||||
_pulseColor = color;
|
||||
@ -269,9 +247,6 @@ void wsLED::pulse(LEDRGB color, uint32_t duration)
|
||||
_pulseDuration = duration;
|
||||
_ledState = LED_PULSE_START;
|
||||
_handler.attach_ms(5, ledTrampoline, this);
|
||||
#if defined(ESP32)
|
||||
xSemaphoreGive(_mutex);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -281,14 +256,14 @@ ledstate_t wsLED::getState(void)
|
||||
return _ledState;
|
||||
}
|
||||
|
||||
void wsLED::stop(void)
|
||||
void wsLED::stop(LEDRGB color)
|
||||
{
|
||||
|
||||
if (NOT_A_PIN != _pin) {
|
||||
_handler.detach();
|
||||
_ledState = LED_STOP;
|
||||
_scale = 0xff;
|
||||
setColor(LEDRGB(0, 0, 0));
|
||||
setColor(color);
|
||||
show();
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,7 @@ SOFTWARE.
|
||||
See more at http://www.xpablo.cz
|
||||
*/
|
||||
|
||||
#ifndef __WSLED_H__
|
||||
#define __WSLED_H__
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
#include <Ticker.h>
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
@ -146,16 +145,12 @@ protected:
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
int _rmtChannel;
|
||||
rmt_item32_t led_data_buffer[LED_BUFFER_ITEMS];
|
||||
SemaphoreHandle_t _mutex;
|
||||
#endif
|
||||
uint32_t _endtime;
|
||||
|
||||
void show(void);
|
||||
void setColor(LEDRGB color);
|
||||
bool canShow(void);
|
||||
#if defined(ARDUINO_ARCH_ESP32)
|
||||
portMUX_TYPE _mux = portMUX_INITIALIZER_UNLOCKED;
|
||||
#endif
|
||||
|
||||
public:
|
||||
wsLED(int pin, int order = RGB);
|
||||
@ -169,8 +164,5 @@ public:
|
||||
void setOrder(int neworder);
|
||||
ledstate_t getState(void);
|
||||
void pulse(LEDRGB color, uint32_t duration);
|
||||
void stop(void);
|
||||
void stop(LEDRGB color = LEDRGB(0, 0, 0));
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user