You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
6.7 KiB
225 lines
6.7 KiB
4 months ago
|
#include "Adafruit_Keypad.h"
|
||
|
#include "led_strip_rmt_ws2812.cpp"
|
||
|
#include "ESPRotary.h"
|
||
|
#include <Wire.h> // I2C
|
||
|
#include "driver/gpio.h"
|
||
|
#include "controls.h"
|
||
|
|
||
|
#define LED_STRIP_LED_NUMBERS 30
|
||
|
|
||
|
#define ROWS 5 // rows
|
||
|
#define COLS 6 // columns
|
||
|
|
||
|
// #define NEOPIXEL_PIN 21
|
||
|
#define NUM_PIXELS (ROWS * COLS)
|
||
|
|
||
|
#define ROTARY_PIN1 42
|
||
|
#define ROTARY_PIN2 2
|
||
|
#define CLICKS_PER_STEP 4 // this number depends on your rotary encoder
|
||
|
#define BUTTON_PIN 1
|
||
|
|
||
|
// joystick
|
||
|
#define BUTTON_PIN2 41
|
||
|
#define JOY_X 40
|
||
|
#define JOY_Y 39
|
||
|
// I2C
|
||
|
#define I2C_SDA 37
|
||
|
#define I2C_SCL 36
|
||
|
|
||
|
#define I2C_INTERUPT GPIO_NUM_38
|
||
|
|
||
|
static const char *TAG = "controls";
|
||
|
// #define SERIAL_SPEED 115200
|
||
|
bool lit[ROWS * COLS] = {0};
|
||
|
// define the symbols on the buttons of the keypads
|
||
|
char keys[ROWS][COLS] = {
|
||
|
{'1', '2', '3', '4', '5', '6'},
|
||
|
{'7', '8', '9', 'A', 'B', 'C'},
|
||
|
{'D', 'E', 'F', 'G', 'H', 'I'},
|
||
|
{'J', 'K', 'L', 'M', 'N', 'O'},
|
||
|
{'P', 'Q', 'R', 'S', 'T', 'U'}};
|
||
|
|
||
|
uint8_t rowPins[ROWS] = {46, 3, 8, 18, 17}; // connect to the row pinouts of the keypad
|
||
|
uint8_t colPins[COLS] = {16, 15, 7, 6, 5, 4}; // connect to the column pinouts of the keypad
|
||
|
|
||
|
uint8_t controls[512] = {0};
|
||
|
ESPRotary r;
|
||
|
|
||
|
Adafruit_Keypad customKeypad = Adafruit_Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
|
||
|
|
||
|
void setControl(uint16_t controlNum, uint8_t value)
|
||
|
{
|
||
|
uint16_t keynum = controlNum;
|
||
|
bool litValue = false;
|
||
|
if (value > 0)
|
||
|
{
|
||
|
litValue = true;
|
||
|
}
|
||
|
if ((controlNum / 6) % 2 == 1)
|
||
|
{
|
||
|
keynum = controlNum + 5 - (controlNum % 6) * 2;
|
||
|
}
|
||
|
ESP_LOGI(TAG, "begin litValue %i ,%i, %i", (controlNum % 6), controlNum, keynum);
|
||
|
lit[keynum] = litValue; // invert neopixel status
|
||
|
controls[controlNum] = value;
|
||
|
}
|
||
|
|
||
|
void rotate(ESPRotary &r)
|
||
|
{
|
||
|
ESP_LOGI(TAG, "%i", r.getPosition());
|
||
|
}
|
||
|
|
||
|
// on left or right rotation
|
||
|
void showDirection(ESPRotary &r)
|
||
|
{
|
||
|
ESP_LOGI(TAG, "[%s]", r.directionToString(r.getDirection()).c_str());
|
||
|
}
|
||
|
|
||
|
void task_read_all(void *args)
|
||
|
{
|
||
|
// init
|
||
|
r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
|
||
|
r.setChangedHandler(rotate);
|
||
|
r.setLeftRotationHandler(showDirection);
|
||
|
r.setRightRotationHandler(showDirection);
|
||
|
|
||
|
// Setup matrix
|
||
|
static uint8_t const cable_num = 0; // MIDI jack associated with USB endpoint
|
||
|
static uint8_t const channel = 0; // 0 for channel 1
|
||
|
ESP_LOGI(TAG, "begin task_keyboard_read");
|
||
|
customKeypad.begin();
|
||
|
// bool lastAvailable = false;
|
||
|
// I2C
|
||
|
Wire.begin(I2C_SDA, I2C_SCL, 400000L);
|
||
|
pinMode(I2C_INTERUPT, INPUT_PULLUP); // i2c available
|
||
|
for (;;)
|
||
|
{
|
||
|
// TODO delay?
|
||
|
|
||
|
r.loop();
|
||
|
// b.loop();
|
||
|
// b2.loop();
|
||
|
customKeypad.tick();
|
||
|
// ESP_LOGI(TAG, "%i", customKeypad.available());
|
||
|
while (customKeypad.available())
|
||
|
{
|
||
|
keypadEvent e = customKeypad.read();
|
||
|
ESP_LOGI(TAG, "%c", (char)e.bit.KEY);
|
||
|
uint8_t row = e.bit.ROW;
|
||
|
uint8_t col = e.bit.COL;
|
||
|
uint8_t controlNum = row * COLS + col;
|
||
|
if (e.bit.EVENT == KEY_JUST_PRESSED)
|
||
|
{
|
||
|
ESP_LOGI(TAG, " pressed");
|
||
|
ESP_LOGI(TAG, "Row: ");
|
||
|
ESP_LOGI(TAG, "%i", row);
|
||
|
ESP_LOGI(TAG, " col: ");
|
||
|
ESP_LOGI(TAG, "%i", col);
|
||
|
ESP_LOGI(TAG, " -> ");
|
||
|
uint16_t keynum;
|
||
|
if (row % 2 == 0)
|
||
|
{ // even row
|
||
|
keynum = row * COLS + col;
|
||
|
}
|
||
|
else
|
||
|
{ // odd row the neopixels go BACKWARDS!
|
||
|
keynum = row * COLS + (5 - col);
|
||
|
}
|
||
|
ESP_LOGI(TAG, "%i", keynum);
|
||
|
// lit[keynum] = !lit[keynum]; // invert neopixel status
|
||
|
// control[controlNum] = control[controlNum];
|
||
|
setControl(controlNum, 255);
|
||
|
// TODO queue write
|
||
|
// uint8_t base_mac_addr[6] = {0};
|
||
|
// uint8_t control[3] = {SET_CONTROL | channel, controlNum, 127};
|
||
|
// tud_midi_stream_write(cable_num, control, 3);
|
||
|
}
|
||
|
else if (e.bit.EVENT == KEY_JUST_RELEASED)
|
||
|
{
|
||
|
// uint8_t control[3] = {SET_CONTROL | channel, controlNum, 0};
|
||
|
setControl(controlNum, 0);
|
||
|
// TODO queue write
|
||
|
// tud_midi_stream_write(cable_num, control, 3);
|
||
|
ESP_LOGI(TAG, " released");
|
||
|
}
|
||
|
}
|
||
|
// i2c
|
||
|
bool nextAvailable = gpio_get_level(I2C_INTERUPT) == 0;
|
||
|
if (nextAvailable) // || lastAvailable
|
||
|
{
|
||
|
|
||
|
// ESP_LOGI(TAG, "i2cAvailable: %i", i2cAvailable);
|
||
|
// fader9
|
||
|
Wire.requestFrom(55, 18);
|
||
|
while (Wire.available())
|
||
|
{ // peripheral may send less than requested
|
||
|
int c = Wire.read(); // receive a byte
|
||
|
ESP_LOGI(TAG, "value: %i", c);
|
||
|
}
|
||
|
// button8
|
||
|
Wire.requestFrom(56, 8);
|
||
|
while (Wire.available())
|
||
|
{ // peripheral may send less than requested
|
||
|
int c = Wire.read(); // receive a byte
|
||
|
ESP_LOGI(TAG, "value: %i", c);
|
||
|
}
|
||
|
// lastAvailable = nextAvailable;
|
||
|
}
|
||
|
// task delay time?
|
||
|
vTaskDelay(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uint8_t j = 0; // color ticker
|
||
|
|
||
|
void task_led_strip(void *arg)
|
||
|
{
|
||
|
led_strip_handle_t led_strip = configure_led();
|
||
|
ESP_LOGI(TAG1, "Start blinking LED strip");
|
||
|
for (;;)
|
||
|
{
|
||
|
for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++)
|
||
|
{
|
||
|
if (lit[i])
|
||
|
{
|
||
|
uint8_t r = 0;
|
||
|
uint8_t g = 0;
|
||
|
uint8_t b = 0;
|
||
|
byte WheelPos = ((i * 256 / LED_STRIP_LED_NUMBERS) + j) & 255;
|
||
|
if (WheelPos < 85)
|
||
|
{
|
||
|
r = WheelPos * 3;
|
||
|
g = 255 - WheelPos * 3;
|
||
|
b = 0;
|
||
|
}
|
||
|
else if (WheelPos < 170)
|
||
|
{
|
||
|
WheelPos -= 85;
|
||
|
r = 255 - WheelPos * 3;
|
||
|
g = 0;
|
||
|
b = WheelPos * 3;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
WheelPos -= 170;
|
||
|
r = 0;
|
||
|
g = WheelPos * 3;
|
||
|
b = 255 - WheelPos * 3;
|
||
|
}
|
||
|
led_strip_set_pixel(led_strip, i, r, g, b);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
led_strip_set_pixel(led_strip, i, 0, 0, 0);
|
||
|
}
|
||
|
}
|
||
|
ESP_ERROR_CHECK(led_strip_refresh(led_strip));
|
||
|
j++;
|
||
|
vTaskDelay(pdMS_TO_TICKS(20));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void init_controls(controls_config *cfg)
|
||
|
{
|
||
|
ESP_LOGI(TAG1, "cfg.matrix_keys.led_io: %i", cfg->matrix_keys.led_io);
|
||
|
}
|