feat!: handle changed to double pointer

This commit is contained in:
aZholtikov committed 2026-08-02 09:12:51 +03:00
1 parent e7c19680ae
commit f57671206b
7 files changed
+513 -522

No files matched your search

+34 -60
View File
@@ -24,13 +24,13 @@
## Возможности
1. **Поддержка 16 расширителей**: До 16 PCF8574(A) на одной шине I2C (адреса 0x20-0x27 и 0x38-0x3F)
2. **Режимы работы GPIO**: Поддержка выходных и входных режимов для каждого из 8 GPIO
3. **Генерация прерываний**: Поддержка прерываний от входных GPIO (отрицательный фронт)
4. **Статистика ошибок**: Встроенные счетчики ошибок I2C, событий, векторов и переполнения очереди
5. **Потокобезопасность**: Использует драйвер I2C ESP-IDF и FreeRTOS
6. **Минимальные накладные расходы**: Низкие требования к памяти и процессору
7. **Простой API**: Легкое чтение/запись состояния всех GPIO и отдельных пинов
- **Поддержка 16 расширителей**: До 16 PCF8574(A) на одной шине I2C (адреса 0x20-0x27 и 0x38-0x3F)
- **Режимы работы GPIO**: Поддержка выходных и входных режимов для каждого из 8 GPIO
- **Генерация прерываний**: Поддержка прерываний от входных GPIO (отрицательный фронт)
- **Статистика ошибок**: Встроенные счетчики ошибок I2C, событий, векторов и переполнения очереди
- **Потокобезопасность**: Использует драйвер I2C ESP-IDF и FreeRTOS
- **Минимальные накладные расходы**: Низкие требования к памяти и процессору
- **Простой API**: Легкое чтение/запись состояния всех GPIO и отдельных пинов
---
@@ -88,7 +88,7 @@ typedef struct
{
i2c_master_bus_handle_t i2c_handle; // Уникальный дескриптор шины I2C
uint32_t i2c_frequency; // Частота I2C расширителя (макс. 100000 Гц)
uint16_t stack_size; // Размер стека задачи обработки прерываний
uint32_t stack_size; // Размер стека задачи обработки прерываний
uint8_t task_priority; // Приоритет задачи обработки прерываний
uint8_t i2c_address; // Адрес устройства расширителя I2C (0x20-0x27 или 0x38-0x3F)
bool p0_gpio_work_mode; // Режим работы GPIO P0 (false - output, true - input)
@@ -115,17 +115,11 @@ typedef struct
### Структура zh_pcf8574_handle_t
```c
typedef struct
{
uint8_t i2c_address; // Адрес I2C расширителя
uint8_t gpio_work_mode; // Режимы работы GPIO (биты 0-7)
uint8_t gpio_status; // Текущее состояние GPIO (биты 0-7)
bool is_initialized; // Флаг инициализации расширителя
i2c_master_dev_handle_t dev_handle; // Уникальный дескриптор устройства I2C
void *system; // Системный указатель для использования в других компонентах
} zh_pcf8574_handle_t;
typedef struct _zh_pcf8574_handle_t zh_pcf8574_handle_t;
```
Непрозрачный дескриптор экземпляра устройства PCF8574. Внутренняя структура минимальна — хранит только I2C-адрес; полное состояние устройства поддерживается во внутреннем векторе.
---
### Структура zh_pcf8574_stats_t
@@ -163,15 +157,16 @@ typedef struct
**Параметры:**
- `config` - Указатель на структуру конфигурации инициализации PCF8574
- `handle` - Указатель на уникальный дескриптор PCF8574
- `config` - Указатель на структуру конфигурации инициализации PCF8574. Не должен быть NULL
- `handle` - Указатель на указатель на дескриптор PCF8574. Должен быть NULL
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL config или handle)
- `ESP_ERR_INVALID_STATE` - Расширитель уже инициализирован
- `ESP_FAIL` - Ошибка инициализации
- `ESP_ERR_NO_MEM` - Недостаточно памяти
- `ESP_ERR_NOT_SUPPORTED` - Ошибка инициализации I2C
---
@@ -181,14 +176,12 @@ typedef struct
**Параметры:**
- `handle` - Указатель на уникальный дескриптор PCF8574
- `handle` - Указатель на указатель на дескриптор PCF8574. Не должен быть NULL
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle)
- `ESP_ERR_INVALID_STATE` - Расширитель не инициализирован
- `ESP_FAIL` - Ошибка деинициализации
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle или *handle)
---
@@ -198,15 +191,14 @@ typedef struct
**Параметры:**
- `handle` - Указатель на уникальный дескриптор PCF8574
- `reg` - Указатель для хранения состояния GPIO (биты 0-7)
- `handle` - Указатель на указатель на дескриптор PCF8574. Не должен быть NULL
- `reg` - Указатель для хранения состояния GPIO (биты 0-7). Не должен быть NULL
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle или reg)
- `ESP_ERR_NOT_FOUND` - Расширитель не инициализирован
- `ESP_FAIL` - Ошибка связи I2C
- `ESP_ERR_INVALID_STATE` - Расширитель не инициализирован
**Примечание:** Для входных GPIO всегда будет 1 (HIGH).
@@ -218,15 +210,14 @@ typedef struct
**Параметры:**
- `handle` - Указатель на уникальный дескриптор PCF8574
- `handle` - Указатель на указатель на дескриптор PCF8574. Не должен быть NULL
- `reg` - Состояние GPIO (биты 0-7)
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle)
- `ESP_ERR_NOT_FOUND` - Расширитель не инициализирован
- `ESP_FAIL` - Ошибка связи I2C
- `ESP_ERR_INVALID_STATE` - Расширитель не инициализирован
**Примечание:** Влияет только на выходные GPIO.
@@ -238,14 +229,12 @@ typedef struct
**Параметры:**
- `handle` - Указатель на уникальный дескриптор PCF8574
- `handle` - Указатель на указатель на дескриптор PCF8574. Не должен быть NULL
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle)
- `ESP_ERR_NOT_FOUND` - Расширитель не инициализирован
- `ESP_FAIL` - Ошибка связи I2C
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle или *handle)
---
@@ -255,16 +244,15 @@ typedef struct
**Параметры:**
- `handle` - Указатель на уникальный дескриптор PCF8574
- `handle` - Указатель на указатель на дескриптор PCF8574. Не должен быть NULL
- `gpio` - Номер GPIO (ZH_PCF8574_GPIO_NUM_P0 ... ZH_PCF8574_GPIO_NUM_P7)
- `status` - Указатель для хранения состояния GPIO (true - HIGH, false - LOW)
- `status` - Указатель для хранения состояния GPIO (true - HIGH, false - LOW). Не должен быть NULL
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент
- `ESP_ERR_NOT_FOUND` - Расширитель не инициализирован
- `ESP_FAIL` - Ошибка связи I2C
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle, gpio, status или выход gpio за пределы)
- `ESP_ERR_INVALID_STATE` - Расширитель не инициализирован
**Примечание:** Для входных GPIO всегда будет 1 (HIGH).
@@ -276,16 +264,15 @@ typedef struct
**Параметры:**
- `handle` - Указатель на уникальный дескриптор PCF8574
- `handle` - Указатель на указатель на дескриптор PCF8574. Не должен быть NULL
- `gpio` - Номер GPIO (ZH_PCF8574_GPIO_NUM_P0 ... ZH_PCF8574_GPIO_NUM_P7)
- `status` - Состояние GPIO (true - HIGH, false - LOW)
**Возвращает:**
- `ESP_OK` - Успех
- `ESP_ERR_INVALID_ARG` - Неверный аргумент
- `ESP_ERR_NOT_FOUND` - Расширитель не инициализирован
- `ESP_FAIL` - Ошибка связи I2C
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL handle, gpio, status или выход gpio за пределы)
- `ESP_ERR_INVALID_STATE` - Расширитель не инициализирован
**Примечание:** Влияет только на выходные GPIO.
@@ -299,25 +286,12 @@ typedef struct
- Указатель на структуру статистики
**Пример:**
```c
const zh_pcf8574_stats_t *stats = zh_pcf8574_get_stats();
printf("Ошибки I2C: %ld\n", stats->i2c_driver_error);
```
---
### zh_pcf8574_reset_stats()
Сбрасывает счетчики статистики ошибок.
**Пример:**
```c
zh_pcf8574_reset_stats();
```
---
## Примеры использования
@@ -445,7 +419,7 @@ void app_main(void)
## Технические характеристики
| Параметр | Значение |
|----------|----------|
| ---------- | ---------- |
| **Тип устройства** | 8-битный I2C GPIO расширитель |
| **Модели** | PCF8574, PCF8574A |
| **Количество устройств на шине** | До 16 (адреса 0x20-0x27, 0x38-0x3F) |
@@ -463,7 +437,7 @@ void app_main(void)
## Коды ошибок
| Код ошибки | Описание |
|------------|----------|
| ------------ | ---------- |
| `ESP_OK` | Операция выполнена успешно |
| `ESP_ERR_INVALID_ARG` | Неверный аргумент (NULL указатель или неверная конфигурация) |
| `ESP_ERR_INVALID_STATE` | Устройство не инициализировано или уже инициализировано |
@@ -519,4 +493,4 @@ void app_main(void)
---
*Сгенерировано для zh_pcf8574 v2.8.2*
"*Сгенерировано для zh_pcf8574 v3.0.0*"