1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

esp32: add leds sine fade helper

This commit is contained in:
Andy Green 2017-05-07 13:24:48 +08:00
parent 5468812946
commit 2790d5b28c
2 changed files with 57 additions and 0 deletions

View file

@ -602,6 +602,10 @@ lws_esp_ota_get_boot_partition(void);
extern int
lws_esp32_get_image_info(const esp_partition_t *part, struct lws_esp32_image *i, char *json, int json_len);
extern uint32_t lws_esp32_get_reboot_type(void);
extern uint16_t lws_esp32_sine_interp(int n);
/* required in external code by esp32 plat (may just return if no leds) */
extern void lws_esp32_leds_timer_cb(TimerHandle_t th);
#else
typedef int lws_sockfd_type;
typedef int lws_filefd_type;

View file

@ -574,6 +574,8 @@ char *ERR_error_string(unsigned long e, char *buf)
#include <tcpip_adapter.h>
#include <esp_image_format.h>
#include <esp_task_wdt.h>
#include "soc/ledc_reg.h"
#include "driver/ledc.h"
struct lws_esp32 lws_esp32 = {
.model = CONFIG_LWS_MODEL_NAME,
@ -582,6 +584,7 @@ struct lws_esp32 lws_esp32 = {
};
static romfs_t lws_esp32_romfs;
static TimerHandle_t leds_timer;
struct esp32_file {
const struct inode *i;
@ -1002,6 +1005,20 @@ lws_esp32_init(struct lws_context_creation_info *info)
char buf[512];
size_t s;
int n;
ledc_timer_config_t ledc_timer = {
.bit_num = LEDC_TIMER_13_BIT,
.freq_hz = 5000,
.speed_mode = LEDC_HIGH_SPEED_MODE,
.timer_num = LEDC_TIMER_0
};
ledc_timer_config(&ledc_timer);
/* user code needs to provide lws_esp32_leds_timer_cb */
leds_timer = xTimerCreate("lws_leds", pdMS_TO_TICKS(25), 1, NULL,
(TimerCallbackFunction_t)lws_esp32_leds_timer_cb);
xTimerStart(leds_timer, 0);
ESP_ERROR_CHECK(nvs_open("lws-station", NVS_READWRITE, &nvh));
n = 0;
@ -1052,3 +1069,39 @@ lws_esp32_init(struct lws_context_creation_info *info)
return context;
}
static const uint16_t sineq16[] = {
0x0000, 0x0191, 0x031e, 0x04a4, 0x061e, 0x0789, 0x08e2, 0x0a24,
0x0b4e, 0x0c5c, 0x0d4b, 0x0e1a, 0x0ec6, 0x0f4d, 0x0faf, 0x0fea,
};
static uint16_t sine_lu(int n)
{
switch ((n >> 4) & 3) {
case 0:
return 4096 + sineq16[n & 15];
case 1:
return 4096 + sineq16[15 - (n & 15)];
case 2:
return 4096 - sineq16[n & 15];
default:
return 4096 - sineq16[15 - (n & 15)];
}
}
/* useful for sine led fade patterns */
uint16_t lws_esp32_sine_interp(int n)
{
/*
* 2: quadrant
* 4: table entry in quadrant
* 4: interp (LSB)
*
* total 10 bits / 1024 steps per cycle
*/
return (sine_lu(n >> 4) * (15 - (n & 15)) +
sine_lu((n >> 4) + 1) * (n & 15)) / 15;
}