Переделал, второй вариант более не рассматривается. Misra надо
уважать хоть и без фанатизма да и не нравятся мне эстетически куча
return из потрохов функции. typedef struct {
uint8_t counter: 7; // счетчик фильтра лампы
bool state: 1; // текущее отфильтрованное состояние
} __attribute__ ((packed)) l_memory_t;
typedef struct {
uint8_t counter: 6; // счетчик подавления дребезга
bool hold: 1; // флаг долгого удержания кнопки в нажатом состоянии
bool state: 1; // текущее отфильтрованное состояние
} __attribute__ ((packed)) b_memory_t;
// обе структуры укладываются ровно в 8 бит (1 байт), проверим их размер
_Static_assert(sizeof(l_memory_t) == 1, "l_memory_t size != 1");
_Static_assert(sizeof(l_memory_t) == 1, "b_memory_t size != 1");
// память для фильтрации сигнала датчков ламп
static l_memory_t lamp_memory[DIGIN_LAMPDET_BITS]={0};
// память для устранения дребезга кнопок
static b_memory_t btn_memory[DIGIN_INPUT_BITS]={0};
/* возвращает текущее состояние лампы или кнопки
* на входе: bitpos - позиция бита
* на выходе: текущее состояние
*/
bool get_state_by_bitpos(uint8_t bitpos)
{
bitpos_desc_t* desc = bitpos2device(bitpos); // описание устройства
bool ret;
switch (desc->type)
{
case DIGIN_DEV_LAMP:
ret = lamp_memory[desc->idx].state;
break;
case DIGIN_DEV_BTN:
ret = btn_memory[desc->idx].state;
break;
default:
PR_DEBUG("%s Invalid bitpos %u\n", __FUNCTION__, bitpos); // неверный номер бита, ошибка
ret = false;
} // switch
return ret;
}