Auto mode switch implemented
This commit is contained in:
@@ -65,6 +65,8 @@ typedef enum DLMode_t_enum {
|
||||
#define CONF_FLASH_ADDR ((uint32_t)0x0800F800) //FLASH address of the page to save configuration to
|
||||
#define CONF_FLASH_PAGE 31 //FLASH page number (from 0 to PgCount-1)
|
||||
|
||||
#define AUTO_SWITCH_TIME 7200 //Time in seconds to auto switch to normal mode from manual_off mode
|
||||
|
||||
/* USER CODE END PD */
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
@@ -78,6 +80,7 @@ CRC_HandleTypeDef hcrc;
|
||||
I2C_HandleTypeDef hi2c1;
|
||||
|
||||
TIM_HandleTypeDef htim3;
|
||||
TIM_HandleTypeDef htim14;
|
||||
TIM_HandleTypeDef htim16;
|
||||
TIM_HandleTypeDef htim17;
|
||||
|
||||
@@ -101,6 +104,7 @@ int8_t dLevel = 1; // Direction of fade: -1 for fade out; 1 for fade in
|
||||
DLMode_t DLmode = DL_normal; // Global mode: DL_normal, DL_manual_on, DL_manual_off, DL_need_config, DL_config_waiting, DL_config_accepted, DL_error
|
||||
DLMode_t prev_mode = DL_normal; // To hold the mode during temporary mode switches
|
||||
uint8_t modeSwitch = 0; // Flag to switch the mode after the button tap
|
||||
uint16_t autoSwitchTime = 0; // Time counter until mode auto switch
|
||||
|
||||
/* USER CODE END PV */
|
||||
|
||||
@@ -112,6 +116,7 @@ static void MX_TIM3_Init(void);
|
||||
static void MX_TIM17_Init(void);
|
||||
static void MX_CRC_Init(void);
|
||||
static void MX_TIM16_Init(void);
|
||||
static void MX_TIM14_Init(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
volatile void loadConfig(void); // Load configuration from the FLASH memory
|
||||
@@ -281,9 +286,11 @@ int main(void)
|
||||
MX_TIM17_Init();
|
||||
MX_CRC_Init();
|
||||
MX_TIM16_Init();
|
||||
MX_TIM14_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
// TIM3 - PWM timer
|
||||
// TIM14 - to measure time for mode auto switch (1Hz)
|
||||
// TIM16 - ticks timer (10Hz - 100ms)
|
||||
// TIM17 - timer for light fading
|
||||
|
||||
@@ -331,13 +338,15 @@ int main(void)
|
||||
DLmode = DL_manual_on;
|
||||
fastBlink(1);
|
||||
dLevel = 2;
|
||||
HAL_TIM_Base_Start_IT(&htim17);
|
||||
HAL_TIM_Base_Start_IT(&htim17); // Rise up the light
|
||||
break;
|
||||
case DL_manual_on:
|
||||
DLmode = DL_manual_off;
|
||||
fastBlink(1);
|
||||
dLevel = -1;
|
||||
HAL_TIM_Base_Start_IT(&htim17);
|
||||
HAL_TIM_Base_Start_IT(&htim17); // Fade out the light
|
||||
autoSwitchTime = AUTO_SWITCH_TIME;
|
||||
HAL_TIM_Base_Start_IT(&htim14); // Start counting OFF time
|
||||
break;
|
||||
case DL_manual_off:
|
||||
DLmode = DL_normal;
|
||||
@@ -540,6 +549,37 @@ static void MX_TIM3_Init(void)
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TIM14 Initialization Function
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
static void MX_TIM14_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN TIM14_Init 0 */
|
||||
|
||||
/* USER CODE END TIM14_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN TIM14_Init 1 */
|
||||
|
||||
/* USER CODE END TIM14_Init 1 */
|
||||
htim14.Instance = TIM14;
|
||||
htim14.Init.Prescaler = 6400-1;
|
||||
htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim14.Init.Period = 10000-1;
|
||||
htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN TIM14_Init 2 */
|
||||
|
||||
/* USER CODE END TIM14_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TIM16 Initialization Function
|
||||
* @param None
|
||||
@@ -659,6 +699,7 @@ volatile void setLightLevel(uint8_t level) {
|
||||
}
|
||||
|
||||
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) {
|
||||
// Button has been pressed
|
||||
// Start counting "ticks" when the sense-button is pressed
|
||||
if (GPIO_Pin == Btn_INT_Pin) {
|
||||
btn_ticks = 0;
|
||||
@@ -704,7 +745,7 @@ void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {
|
||||
}
|
||||
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
|
||||
if(htim->Instance == TIM16) { //check if the interrupt comes from TIM16 // TIM16 - ticks timer (10Hz - 100ms)
|
||||
if (htim->Instance == TIM16) { //check if the interrupt comes from TIM16 // TIM16 - ticks timer (10Hz - 100ms)
|
||||
if (btn_ticks < 60) {
|
||||
btn_ticks++;
|
||||
} else {
|
||||
@@ -716,7 +757,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
|
||||
}
|
||||
|
||||
// Fade-in / fade-out animation
|
||||
if(htim->Instance == TIM17) { //check if the interrupt comes from TIM17 // TIM17 - timer for light fading
|
||||
if (htim->Instance == TIM17) { //check if the interrupt comes from TIM17 // TIM17 - timer for light fading
|
||||
if ((curLightLevel >= 99 && dLevel > 0) || (curLightLevel == 0 && dLevel < 0)) {
|
||||
HAL_TIM_Base_Stop_IT(&htim17);
|
||||
} else {
|
||||
@@ -724,6 +765,16 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
|
||||
setLightLevel(curLightLevel);
|
||||
}
|
||||
}
|
||||
|
||||
// Mode auto-switch time counter
|
||||
if (htim->Instance == TIM14) { //check if the interrupt comes from TIM14 // TIM14 - to measure time for mode auto switch (1Hz)
|
||||
if (autoSwitchTime > 0) {
|
||||
autoSwitchTime--;
|
||||
} else {
|
||||
modeSwitch = 1;
|
||||
HAL_TIM_Base_Stop_IT(&htim14);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE END 4 */
|
||||
|
@@ -218,6 +218,20 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
|
||||
|
||||
/* USER CODE END TIM3_MspInit 1 */
|
||||
}
|
||||
else if(htim_base->Instance==TIM14)
|
||||
{
|
||||
/* USER CODE BEGIN TIM14_MspInit 0 */
|
||||
|
||||
/* USER CODE END TIM14_MspInit 0 */
|
||||
/* Peripheral clock enable */
|
||||
__HAL_RCC_TIM14_CLK_ENABLE();
|
||||
/* TIM14 interrupt Init */
|
||||
HAL_NVIC_SetPriority(TIM14_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM14_IRQn);
|
||||
/* USER CODE BEGIN TIM14_MspInit 1 */
|
||||
|
||||
/* USER CODE END TIM14_MspInit 1 */
|
||||
}
|
||||
else if(htim_base->Instance==TIM16)
|
||||
{
|
||||
/* USER CODE BEGIN TIM16_MspInit 0 */
|
||||
@@ -294,6 +308,20 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
|
||||
|
||||
/* USER CODE END TIM3_MspDeInit 1 */
|
||||
}
|
||||
else if(htim_base->Instance==TIM14)
|
||||
{
|
||||
/* USER CODE BEGIN TIM14_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END TIM14_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_TIM14_CLK_DISABLE();
|
||||
|
||||
/* TIM14 interrupt DeInit */
|
||||
HAL_NVIC_DisableIRQ(TIM14_IRQn);
|
||||
/* USER CODE BEGIN TIM14_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END TIM14_MspDeInit 1 */
|
||||
}
|
||||
else if(htim_base->Instance==TIM16)
|
||||
{
|
||||
/* USER CODE BEGIN TIM16_MspDeInit 0 */
|
||||
|
@@ -55,6 +55,7 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern TIM_HandleTypeDef htim14;
|
||||
extern TIM_HandleTypeDef htim16;
|
||||
extern TIM_HandleTypeDef htim17;
|
||||
/* USER CODE BEGIN EV */
|
||||
@@ -169,6 +170,20 @@ void EXTI4_15_IRQHandler(void)
|
||||
/* USER CODE END EXTI4_15_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM14 global interrupt.
|
||||
*/
|
||||
void TIM14_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM14_IRQn 0 */
|
||||
|
||||
/* USER CODE END TIM14_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim14);
|
||||
/* USER CODE BEGIN TIM14_IRQn 1 */
|
||||
|
||||
/* USER CODE END TIM14_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM16 global interrupt.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user