/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "math.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "pwm.h"
#include "rs_message.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
UART_SettingsTypeDef modbus1_suart;
TIM_SettingsTypeDef modbus1_stim;
RS_HandleTypeDef hmodbus1;
RS_MsgTypeDef MODBUS_MSG;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
//MODBUS_HandleTypeDef hmodbus1;
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/** 
	* @brief 	reInitialize Peripheral.
	* @note 	Данная функция необходима, если запрос на реинициализацию приходит от другой периферии.
	*					И чтобы не реинициализировать периферию в прерывании, она реинится в main while(1).
	*/
void Periph_reInit(void)
{
	unsigned UpdatePWMTIM = 0;
	unsigned UpdateLog = 0;

	//	if (sin3Phase)
	//		coils_regs[0]=0xc;
	//////////////âêë/âûêë 74AC08//////////	
	if ((GPIOC->IDR & (1 << 1)) == 0)
		GPIOC->ODR &= ~(1 << 0);
	else
		GPIOC->ODR |= (1 << 0);
	///////////////////////////////////////	


		// wait for reinit modbus coil (requested by modbus interrupt)		
	if (MB_Read_Coil_Global(COIL_UART_CTRL_GLOBAL, NULL) && hmodbus1.fTX_Done)
	{
		MB_Write_Coil_Global(COIL_UART_CTRL_GLOBAL, RESET_COIL);
		modbus1_suart.huart.Init.BaudRate = uart_ctrl[R_UART_CTRL_SPEED];
		RS_ReInit_UART(&hmodbus1, &modbus1_suart);
	}

	// fait for reinit log timer (requested by modbus interrupt)
	if ((TIM_CTRL.sTimFreqHz != log_ctrl[R_LOG_CTRL_LOG_HZ]) && (log_ctrl[R_LOG_CTRL_LOG_HZ] != 0))
	{
		TIM_CTRL.sTimFreqHz = log_ctrl[R_LOG_CTRL_LOG_HZ];
		// update logs params
		UpdateLog = 1;
		TIM_Base_MspDeInit(&TIM_CTRL.htim);
		Control_Timer_ReInit(&TIM_CTRL);
		//		hpwm_a.hramp[PWM_RampSineHz_Ind].SampleT = 1.0f/TIM_CTRL.sTimFreqHz;
		//		hpwm_a.hramp[PWM_RampPWMDuty_Ind].SampleT = 1.0f/TIM_CTRL.sTimFreqHz;
	}

	// READ	TIM_PWM_HZ
	if (hpwm.tim_a.stim.sTimFreqHz != pwm_ctrl[R_PWM_CTRL_PWM_HZ])
	{
		hpwm.tim_a.stim.sTimFreqHz = pwm_ctrl[R_PWM_CTRL_PWM_HZ];
		pwm_ctrl[R_PWM_CTRL_PWM_HZ] = hpwm.tim_a.stim.sTimFreqHz;

		// update tim
		UpdatePWMTIM = 1;
		// update logs params
		UpdateLog = 1;
	}


	// READ	TICKBASE_PRESCALER
	if (hpwm.tim_a.stim.sTickBasePrescaler != pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER])
	{
		if ((hpwm.tim_a.stim.sTickBasePrescaler > 1) ||
			(pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER] > 1))
		{
			hpwm.tim_a.stim.sTickBasePrescaler = pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER];
			pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER] = hpwm.tim_a.stim.sTickBasePrescaler;

			// update tim
			UpdatePWMTIM = 1;
			// update logs params
			UpdateLog = 1;
		}
	}

	// UPDATE LOG PARAMS
	if (UpdateLog)
	{
		// set logs params
		Set_Log_Params();
	}

	// UPDATE PWM TIM PARAMS
	if (UpdatePWMTIM)
	{
		// reinit tims
		PWM_Sine_ReInit(&hpwm);

		// UPDATE DUTY TABLE SCALE
		PWM_Update_Params(&hpwm);
	}

}


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main_init(void)
 {
  /* USER CODE BEGIN 1 */
	__HAL_DBGMCU_FREEZE_TIM1();
	__HAL_DBGMCU_FREEZE_TIM3();
	__HAL_DBGMCU_FREEZE_TIM4();
	__HAL_DBGMCU_FREEZE_TIM12();
	// 0xE0042008
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */

  /* Configure the system clock */
  //SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */		

		// init params for pwm and log
  pwm_ctrl[R_PWM_CTRL_PWM_SINE_HZ] = 10000;
  pwm_ctrl[R_PWM_CTRL_DUTY_BRIDGE] = 10000;//HZ_TIMER_PWM;
  pwm_ctrl[R_PWM_CTRL_PWM_HZ] = 15000;//HZ_TIMER_PWM;
  pwm_ctrl[R_PWM_CTRL_MAX_PULSE_DUR] = 0;
  pwm_ctrl[R_PWM_CTRL_MIN_PULSE_DUR] = 0;
  pwm_ctrl[R_PWM_CTRL_DEAD_TIME] = 100;
  pwm_ctrl[R_PWM_CTRL_SIN_TABLE_SIZE] = SIN_TABLE_SIZE_MAX;
  MB_Write_Coil_Global(COIL_PWM_PHASE_MODE_GLOBAL, SET_COIL);
  MB_Write_Coil_Global(COIL_PWM_BRIDGE_MODE_GLOBAL, SET_COIL);
  MB_Write_Coil_Global(COIL_PWM_DC_MODE_GLOBAL, SET_COIL);

  log_ctrl[R_LOG_CTRL_LOG_HZ] = HZ_TIMER_CTRL;
  log_ctrl[R_LOG_CTRL_LOG_SIZE] = 50;
  log_ctrl[R_LOG_CTRL_LOG_PWM_NUMB] = 3;

  MODBUS_FirstInit();
  Control_Timer_FirstInit();
  PWM_Sine_FirstInit();
	
	//---------------TEST MODBUS------------------
//	MODBUS_Transmit_IT(&hmodbus1, &MODBUS_MSG);		
	//RS_Receive_IT(&hmodbus1, &MODBUS_MSG);

//  while (1)
//  {		
//    /* USER CODE END WHILE */		
//		Periph_reInit();
//    /* USER CODE BEGIN 3 */
////		HAL_Delay(200);
////		MB_Toogle_Coil_Local(&GPIOD->ODR, COIL_GPIOD_LED3);
//  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
}

/* USER CODE BEGIN 4 */
HAL_StatusTypeDef HAL_FLASH_Unlock() {}
HAL_StatusTypeDef HAL_FLASH_Lock() {}
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) {}
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef* pEraseInit, uint32_t* SectorError) {}
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) {}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
