ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
6 февраля
1568998 Топик полностью
3m (Вчера, 17:33, просмотров: 51) ответил 3m на Какой вариант оставить ? (вопрос чисто эстетический, размер кода одинаковый)
Переделал, второй вариант более не рассматривается. 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;
}