/* 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_ll_dma.h"
#include "stm32g0xx.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"

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

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "gpio.h"
#include "ds3231.h"
#include "bme280.h"
#include "rtos.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;

volatile 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 _reserv:    25;
} 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 */
#define I2C_RET_OK    (int8_t)0
#define I2C_RET_NACK  (int8_t)-1
#define I2C_RET_ERR   (int8_t)-2

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */
#define LATCH_DOWN    GPIOA->BRR = 0x8000
#define LATCH_UP      GPIOA->BSRR = 0x8000

#define TUBE_PWR_ON   GPIOA->BRR = 0x10
#define TUBE_PWR_OFF  GPIOA->BSRR = 0x10

#define IN15_P        GPIOA->BSRR = 0x1
#define IN15_Plus     GPIOA->BSRR = 0x2
#define IN15_Minus    GPIOA->BSRR = 0x4
#define IN15_Percent  GPIOA->BSRR = 0x8
#define IN15_OFF      GPIOA->BRR = 0xF

#define COLOR_R(x)          TIM3->CCR1 = x
#define COLOR_B(x)          TIM3->CCR2 = x
#define COLOR_G(x)          TIM3->CCR3 = x
#define COLOR_RGB(r, g, b)  TIM3->CCR1 = r; TIM3->CCR3 = g; TIM3->CCR2 = b

/* USER CODE END EM */

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

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
#define LC0_Pin LL_GPIO_PIN_0
#define LC0_GPIO_Port GPIOA
#define LC1_Pin LL_GPIO_PIN_1
#define LC1_GPIO_Port GPIOA
#define LC2_Pin LL_GPIO_PIN_2
#define LC2_GPIO_Port GPIOA
#define LC3_Pin LL_GPIO_PIN_3
#define LC3_GPIO_Port GPIOA
#define SHDN_Pin LL_GPIO_PIN_4
#define SHDN_GPIO_Port GPIOA
#define PWM_R_Pin LL_GPIO_PIN_6
#define PWM_R_GPIO_Port GPIOA
#define PWM_G_Pin LL_GPIO_PIN_7
#define PWM_G_GPIO_Port GPIOA
#define PWM_B_Pin LL_GPIO_PIN_0
#define PWM_B_GPIO_Port GPIOB
#define PWM_T_Pin LL_GPIO_PIN_1
#define PWM_T_GPIO_Port GPIOB
#define BTN1_Pin LL_GPIO_PIN_8
#define BTN1_GPIO_Port GPIOA
#define BTN2_Pin LL_GPIO_PIN_9
#define BTN2_GPIO_Port GPIOA
#define BTN3_Pin LL_GPIO_PIN_10
#define BTN3_GPIO_Port GPIOA
#define BTN4_Pin LL_GPIO_PIN_11
#define BTN4_GPIO_Port GPIOA
#define Latch_Pin LL_GPIO_PIN_15
#define Latch_GPIO_Port GPIOA
#define IRQ_Pin LL_GPIO_PIN_8
#define IRQ_GPIO_Port GPIOB
#define IRQ_EXTI_IRQn EXTI4_15_IRQn
/* USER CODE BEGIN Private defines */
#define USE_FULL_LL_DRIVER 1

/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

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