create i2c command tasks with mutex

This commit is contained in:
Martijn Scheepers
2022-05-12 10:11:41 +02:00
parent 56d90c89a5
commit 56dd646bec
4 changed files with 59 additions and 27 deletions

View File

@@ -112,11 +112,7 @@ bool H2201_dipswitch_read(int sw)
static void IRAM_ATTR H2201_buttons_ISR(void *arg)
{
uint32_t io_num = (uint32_t)arg;
// if (gpio_get_level(io_num) == 0)
//{
// h2201_dispatcher_add_event(BUTTON_EVENTS, BUTTON_PRESS_EVENT, io_num);
h2201_dispatcher_dowork_fromISR(h2201_buttons_eventhandler, BUTTON_PRESS_EVENT, &io_num, sizeof(io_num));
// }
}
void H2201_buttons_init(void)

View File

@@ -20,7 +20,7 @@ bool h2201_dispatcher_dowork(h2201_dispatcher_cb_t p_cback, uint16_t event, void
h2201_dispatcher_msg_t msg;
memset(&msg, 0, sizeof(h2201_dispatcher_msg_t));
msg.sig = BT_APP_SIG_WORK_DISPATCH;
msg.sig = H2201_DISPATCHER_SIG_DOWORK;
msg.event = event;
msg.cb = p_cback;
@@ -59,7 +59,7 @@ void h2201_dispatcher_dowork_fromISR(h2201_dispatcher_cb_t p_cback, uint16_t eve
h2201_dispatcher_msg_t msg;
memset(&msg, 0, sizeof(h2201_dispatcher_msg_t));
msg.sig = BT_APP_SIG_WORK_DISPATCH;
msg.sig = H2201_DISPATCHER_SIG_DOWORK;
msg.event = event;
msg.cb = p_cback;
@@ -90,7 +90,7 @@ bool h2201_dispatcher_dowork_simple_fromISR(h2201_dispatcher_cb_t p_cback, uint1
h2201_dispatcher_msg_t msg;
// memset(&msg, 0, sizeof(h2201_dispatcher_msg_t));
msg.sig = BT_APP_SIG_WORK_DISPATCH;
msg.sig = H2201_DISPATCHER_SIG_DOWORK;
msg.event = event;
msg.cb = p_cback;
msg.param = NULL;
@@ -149,8 +149,7 @@ static void H2201_dispatcher_task(void *arg)
ESP_LOGI(H2201_DISPATCHER_TAG, "sig 0x%x", msg.sig);
switch (msg.sig)
{
case BT_APP_SIG_WORK_DISPATCH:
// h2201_dispatcher_work_dispatched(&msg);
case H2201_DISPATCHER_SIG_DOWORK:
if (msg.cb)
{
msg.cb(msg.event, msg.param);

View File

@@ -7,7 +7,7 @@
#define H2201_DISPATCHER_QUEUE_SIZE 30
#define BT_APP_SIG_WORK_DISPATCH (0x01)
#define H2201_DISPATCHER_SIG_DOWORK (0x01)
/**
* @brief handler for the dispatched work

View File

@@ -7,6 +7,57 @@
#include "H2201_V1_IC1_PARAM.h"
#include "SigmaStudioFW.h"
SemaphoreHandle_t i2c_block_mutex = NULL;
void H2201_i2c_beep_task(void *arg)
{
printf("start beep task \n");
if (xSemaphoreTake(i2c_block_mutex, (TickType_t)portMAX_DELAY) == pdTRUE)
{
ADI_REG_TYPE beep_on[4] = {0x00, 0x80, 0x00, 0x00};
SIGMA_WRITE_REGISTER_BLOCK(DEVICE_ADDR_IC1, MOD_BEEPSWITCH_ISON_ADDR, 4, beep_on);
vTaskDelay(400 / portTICK_PERIOD_MS);
ADI_REG_TYPE beep_off[4] = {0x00, 0x00, 0x00, 0x00};
SIGMA_WRITE_REGISTER_BLOCK(DEVICE_ADDR_IC1, MOD_BEEPSWITCH_ISON_ADDR, 4, beep_off);
xSemaphoreGive(i2c_block_mutex);
}
else
{
printf("cannot get mutex \n");
}
vTaskDelete(NULL);
}
void H2201_i2c_beep(void)
{
xTaskCreate(H2201_i2c_beep_task, "beep", 2048, NULL, configMAX_PRIORITIES - 3, NULL);
}
void H2201_i2c_volume_task(void *arg)
{
printf("start volume task \n");
uint8_t volume = *((uint8_t *)arg);
if (xSemaphoreTake(i2c_block_mutex, (TickType_t)portMAX_DELAY) == pdTRUE)
{
printf("Master vol %d\n", volume);
SIGMA_WRITE_REGISTER(DEVICE_ADDR_IC1, REG_PLAYBACK_HEADPHONE_LEFT_IC1_ADDR, volume);
// vTaskDelay(10 / portTICK_PERIOD_MS);
SIGMA_WRITE_REGISTER(DEVICE_ADDR_IC1, REG_PLAYBACK_HEADPHONE_RIGHT_IC1_ADDR, volume);
xSemaphoreGive(i2c_block_mutex);
}
else
{
printf("cannot get mutex \n");
}
vTaskDelete(NULL);
}
void H2201_i2c_mastervolume(uint8_t volume)
{
xTaskCreate(H2201_i2c_volume_task, "volume", 2048, (void *)&volume, configMAX_PRIORITIES - 3, NULL);
}
void H2201_i2c_master_init(void)
{
i2c_config_t i2c_config = {
@@ -29,26 +80,12 @@ void H2201_i2c_master_init(void)
ESP_LOGE(H2201_I2C_TAG, "%s i2c driver config failed: %s\n", __func__, esp_err_to_name(err));
return;
}
i2c_block_mutex = xSemaphoreCreateBinary();
xSemaphoreGive(i2c_block_mutex);
}
void H2201_i2c_adau1761_init(void)
{
default_download_IC1();
}
void H2201_i2c_beep(void)
{
ADI_REG_TYPE beep_on[4] = {0x00, 0x80, 0x00, 0x00};
SIGMA_WRITE_REGISTER_BLOCK(DEVICE_ADDR_IC1, MOD_BEEPSWITCH_ISON_ADDR, 4, beep_on);
vTaskDelay(400 / portTICK_PERIOD_MS);
ADI_REG_TYPE beep_off[4] = {0x00, 0x00, 0x00, 0x00};
SIGMA_WRITE_REGISTER_BLOCK(DEVICE_ADDR_IC1, MOD_BEEPSWITCH_ISON_ADDR, 4, beep_off);
}
void H2201_i2c_mastervolume(uint8_t volume)
{
printf("Master vol %d\n", volume);
SIGMA_WRITE_REGISTER(DEVICE_ADDR_IC1, REG_PLAYBACK_HEADPHONE_LEFT_IC1_ADDR, volume);
vTaskDelay(10 / portTICK_PERIOD_MS);
SIGMA_WRITE_REGISTER(DEVICE_ADDR_IC1, REG_PLAYBACK_HEADPHONE_RIGHT_IC1_ADDR, volume);
}