/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.h
  * @brief          : Header for main.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32g0xx.h"
#include "stm32g0xx_ll_dma.h"
#include "stm32g0xx_ll_i2c.h"
#include "stm32g0xx_ll_rcc.h"
#include "stm32g0xx_ll_bus.h"
#include "stm32g0xx_ll_system.h"
#include "stm32g0xx_ll_exti.h"
#include "stm32g0xx_ll_cortex.h"
#include "stm32g0xx_ll_utils.h"
#include "stm32g0xx_ll_pwr.h"
#include "stm32g0xx_ll_spi.h"
#include "stm32g0xx_ll_tim.h"
#include "stm32g0xx_ll_gpio.h"
#include "stm32g0xx_ll_usart.h"

#if defined(USE_FULL_ASSERT)
#include "stm32_assert.h"
#endif /* USE_FULL_ASSERT */

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "board.h"
#include "gpio.h"
#include "i2c.h"
#include "ds3231.h"
#include "bme280.h"
#include "rtos.h"
#include "event-system.h"
#include "list_event.h"

/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
typedef enum {
  DOWN = 0,
  UP = 1
} updown_t;

typedef enum {
  OFF = 0,
  ON = 1
} onoff_t;

typedef struct {
  uint32_t RTC_IRQ:     1;
  uint32_t SPI_TX_End:  1;
  uint32_t I2C_TX_End:  1;
  uint32_t I2C_RX_End:  1;
  uint32_t I2C_TX_Err:  1;
  uint32_t I2C_RX_Err:  1;
  uint32_t BME280:      1;
  uint32_t Blink_1:     1;
  uint32_t Blink_2:     1;
  uint32_t Blink_3:     1;
  uint32_t Blink_4:     1;
  uint32_t Blink_5:     1;
  uint32_t _reserv:    20;
} flag_t;
extern volatile flag_t Flag;

typedef union {
  uint16_t u16;           // element specifier for accessing whole u16
  int16_t  i16;           // element specifier for accessing whole i16
  struct {
    #ifdef LITTLE_ENDIAN  // Byte-order is little endian
    uint8_t u8L;          // element specifier for accessing low u8
    uint8_t u8H;          // element specifier for accessing high u8
    #else                 // Byte-order is big endian
    uint8_t u8H;          // element specifier for accessing low u8
    uint8_t u8L;          // element specifier for accessing high u8
    #endif
  } s16;                  // element spec. for acc. struct with low or high u8
} nt16_t;

typedef union {
  uint32_t u32;           // element specifier for accessing whole u32
  int32_t i32;            // element specifier for accessing whole i32
 struct {
    #ifdef LITTLE_ENDIAN  // Byte-order is little endian
    uint16_t u16L;        // element specifier for accessing low u16
    uint16_t u16H;        // element specifier for accessing high u16
    #else                 // Byte-order is big endian
    uint16_t u16H;        // element specifier for accessing low u16
    uint16_t u16L;        // element specifier for accessing high u16
    #endif
  } s32;                  // element spec. for acc. struct with low or high u16
} nt32_t;

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
/* USER CODE BEGIN Private defines */

/* BTNs */
#define BTN_NUM             4
#define BTN1_PIN            GPIO_IDR_ID2
#define BTN2_PIN            GPIO_IDR_ID12
#define BTN3_PIN            GPIO_IDR_ID4
#define BTN4_PIN            GPIO_IDR_ID5
#define BTN1_STATE          (BTN1_GPIO_Port->IDR & BTN1_PIN)
#define BTN2_STATE          (BTN2_GPIO_Port->IDR & BTN2_PIN)
#define BTN3_STATE          (BTN3_GPIO_Port->IDR & BTN3_PIN)
#define BTN4_STATE          (BTN4_GPIO_Port->IDR & BTN4_PIN)
#define BTNS1_STATE         (GPIOB->IDR & (BTN1_PIN | BTN3_PIN))
#define BTNS2_STATE         (GPIOA->IDR & (BTN2_PIN | BTN4_PIN))
#define BTNS_STATE          (BTNS1_STATE | BTNS2_STATE)

/* time constant in ms */
#define BTN_SCAN_PERIOD     10
#define BTN_SCAN_PAUSE      200
#define BTN_TIME_PRESSED    30
#define BTN_TIME_HOLDED     500
#define BTN_TIME_REPEATED   50

typedef struct {
  uint8_t     time;
  es_event_t  pressed;
  es_event_t  holded;
  uint32_t    pin;
  //(GPIO_TypeDef *) GPIOA; // ?->IDR
} btn_t;

/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
