From 3e7c5c5089d2ee3b40be6162c1002934febb53e4 Mon Sep 17 00:00:00 2001 From: bartool Date: Tue, 15 Aug 2023 16:18:48 +0200 Subject: [PATCH] [refactor] prepare for link gen --- firmware/.vscode/settings.json | 9 +- .../Core/Inc/tim.h | 3 - .../Core/Src/main.c | 49 +- .../Core/Src/tim.c | 107 +-- firmware/func_gen_stm32f303re_nucleo/Makefile | 20 +- .../func_gen_stm32f303re_nucleo.ioc | 45 +- firmware/shared_libs/controllers/ctrl_app.c | 633 ++++++------------ firmware/shared_libs/controllers/ctrl_app.h | 50 -- .../shared_libs/controllers/ctrl_app_defs.h | 124 ++++ .../shared_libs/controllers/ctrl_app_types.h | 154 +++-- .../controllers/ctrl_bottom_button.c | 2 - .../controllers/ctrl_bottom_button.h | 2 + .../controllers/ctrl_channel_button.c | 1 - .../controllers/ctrl_channel_button.h | 2 + .../controllers/ctrl_disp_button.c | 244 +++++++ .../controllers/ctrl_disp_button.h | 18 + .../shared_libs/controllers/ctrl_generator.c | 306 --------- .../shared_libs/controllers/ctrl_generator.h | 12 - .../shared_libs/controllers/ctrl_signal_gen.c | 478 +++++++++++++ .../shared_libs/controllers/ctrl_signal_gen.h | 12 + .../shared_libs/disp_layout/disp_layout.c | 66 +- firmware/shared_libs/drivers/ad9833/ad9833.c | 16 +- firmware/shared_libs/drivers/ad9833/ad9833.h | 11 +- firmware/shared_libs/drivers/led/led.c | 19 + firmware/shared_libs/drivers/led/led.h | 8 + firmware/shared_libs/drivers/mcp41x/mcp41x.c | 11 +- firmware/shared_libs/drivers/mcp41x/mcp41x.h | 7 +- firmware/shared_libs/drivers/mcu_cs/mcu_cs.c | 24 + firmware/shared_libs/drivers/mcu_cs/mcu_cs.h | 16 + firmware/shared_libs/utils/spi_cs/spi_cs_if.h | 14 + 30 files changed, 1387 insertions(+), 1076 deletions(-) create mode 100644 firmware/shared_libs/controllers/ctrl_app_defs.h create mode 100644 firmware/shared_libs/controllers/ctrl_disp_button.c create mode 100644 firmware/shared_libs/controllers/ctrl_disp_button.h delete mode 100644 firmware/shared_libs/controllers/ctrl_generator.c delete mode 100644 firmware/shared_libs/controllers/ctrl_generator.h create mode 100644 firmware/shared_libs/controllers/ctrl_signal_gen.c create mode 100644 firmware/shared_libs/controllers/ctrl_signal_gen.h create mode 100644 firmware/shared_libs/drivers/led/led.c create mode 100644 firmware/shared_libs/drivers/led/led.h create mode 100644 firmware/shared_libs/drivers/mcu_cs/mcu_cs.c create mode 100644 firmware/shared_libs/drivers/mcu_cs/mcu_cs.h create mode 100644 firmware/shared_libs/utils/spi_cs/spi_cs_if.h diff --git a/firmware/.vscode/settings.json b/firmware/.vscode/settings.json index ae12079..628ca11 100644 --- a/firmware/.vscode/settings.json +++ b/firmware/.vscode/settings.json @@ -17,7 +17,14 @@ "tim.h": "c", "ulog.h": "c", "ctrl_generator.h": "c", - "type_traits": "c" + "type_traits": "c", + "ctrl_gen_types.h": "c", + "mcp41x.h": "c", + "ctrl_channel_button.h": "c", + "ctrl_encoder.h": "c", + "ctrl_disp_button.h": "c", + "ctrl_app.h": "c", + "ctrl_app_defs.h": "c" }, "cortex-debug.variableUseNaturalFormat": true } \ No newline at end of file diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h index 77fe771..cfa5aea 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h @@ -38,8 +38,6 @@ extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim3; -extern TIM_HandleTypeDef htim17; - /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ @@ -47,7 +45,6 @@ extern TIM_HandleTypeDef htim17; void MX_TIM1_Init(void); void MX_TIM2_Init(void); void MX_TIM3_Init(void); -void MX_TIM17_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c index d97aee7..26d25cf 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c @@ -67,9 +67,9 @@ void RTT_console_logger(ulog_level_t severity, char *msg); /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ + * @brief The application entry point. + * @retval int + */ int main(void) { /* USER CODE BEGIN 1 */ @@ -100,7 +100,6 @@ int main(void) MX_SPI3_Init(); MX_TIM2_Init(); MX_TIM3_Init(); - MX_TIM17_Init(); MX_TIM1_Init(); /* USER CODE BEGIN 2 */ ulog_init(); @@ -148,9 +147,9 @@ int main(void) } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; @@ -158,8 +157,8 @@ void SystemClock_Config(void) RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ + * in the RCC_OscInitTypeDef structure. + */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; @@ -173,8 +172,9 @@ void SystemClock_Config(void) } /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; @@ -184,11 +184,12 @@ void SystemClock_Config(void) { Error_Handler(); } - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_TIM17 | RCC_PERIPHCLK_TIM2 | RCC_PERIPHCLK_TIM34; + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1 + |RCC_PERIPHCLK_TIM1|RCC_PERIPHCLK_TIM2 + |RCC_PERIPHCLK_TIM34; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; - PeriphClkInit.Tim1ClockSelection = RCC_TIM1CLK_HCLK; - PeriphClkInit.Tim17ClockSelection = RCC_TIM17CLK_HCLK; + PeriphClkInit.Tim1ClockSelection = RCC_TIM1CLK_PLLCLK; PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK; PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) @@ -208,9 +209,9 @@ void RTT_console_logger(ulog_level_t severity, char *msg) /* USER CODE END 4 */ /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ @@ -222,14 +223,14 @@ void Error_Handler(void) /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#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 - */ + * @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 */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c index 8656d46..6a2828f 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c @@ -27,7 +27,6 @@ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; -TIM_HandleTypeDef htim17; /* TIM1 init function */ void MX_TIM1_Init(void) @@ -48,7 +47,7 @@ void MX_TIM1_Init(void) htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - htim1.Init.Period = 2; + htim1.Init.Period = 5; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; @@ -73,7 +72,7 @@ void MX_TIM1_Init(void) Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 1; + sConfigOC.Pulse = 3; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; @@ -196,64 +195,6 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 2 */ -} -/* TIM17 init function */ -void MX_TIM17_Init(void) -{ - - /* USER CODE BEGIN TIM17_Init 0 */ - - /* USER CODE END TIM17_Init 0 */ - - TIM_OC_InitTypeDef sConfigOC = {0}; - TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; - - /* USER CODE BEGIN TIM17_Init 1 */ - - /* USER CODE END TIM17_Init 1 */ - htim17.Instance = TIM17; - htim17.Init.Prescaler = 0; - htim17.Init.CounterMode = TIM_COUNTERMODE_UP; - htim17.Init.Period = 2; - htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim17.Init.RepetitionCounter = 0; - htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim17) != HAL_OK) - { - Error_Handler(); - } - if (HAL_TIM_PWM_Init(&htim17) != HAL_OK) - { - Error_Handler(); - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 1; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; - sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; - sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; - if (HAL_TIM_PWM_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; - sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; - sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; - sBreakDeadTimeConfig.DeadTime = 0; - sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; - sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; - sBreakDeadTimeConfig.BreakFilter = 0; - sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; - if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM17_Init 2 */ - - /* USER CODE END TIM17_Init 2 */ - HAL_TIM_MspPostInit(&htim17); - } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) @@ -281,17 +222,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspInit 1 */ } - else if(tim_baseHandle->Instance==TIM17) - { - /* USER CODE BEGIN TIM17_MspInit 0 */ - - /* USER CODE END TIM17_MspInit 0 */ - /* TIM17 clock enable */ - __HAL_RCC_TIM17_CLK_ENABLE(); - /* USER CODE BEGIN TIM17_MspInit 1 */ - - /* USER CODE END TIM17_MspInit 1 */ - } } void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) @@ -332,6 +262,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE BEGIN TIM1_MspPostInit 0 */ /* USER CODE END TIM1_MspPostInit 0 */ + __HAL_RCC_GPIOC_CLK_ENABLE(); /**TIM1 GPIO Configuration PC1 ------> TIM1_CH2 @@ -349,27 +280,6 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE END TIM1_MspPostInit 1 */ } - else if(timHandle->Instance==TIM17) - { - /* USER CODE BEGIN TIM17_MspPostInit 0 */ - - /* USER CODE END TIM17_MspPostInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**TIM17 GPIO Configuration - PB5 ------> TIM17_CH1 - */ - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF10_TIM17; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN TIM17_MspPostInit 1 */ - - /* USER CODE END TIM17_MspPostInit 1 */ - } } @@ -398,17 +308,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspDeInit 1 */ } - else if(tim_baseHandle->Instance==TIM17) - { - /* USER CODE BEGIN TIM17_MspDeInit 0 */ - - /* USER CODE END TIM17_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM17_CLK_DISABLE(); - /* USER CODE BEGIN TIM17_MspDeInit 1 */ - - /* USER CODE END TIM17_MspDeInit 1 */ - } } void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) diff --git a/firmware/func_gen_stm32f303re_nucleo/Makefile b/firmware/func_gen_stm32f303re_nucleo/Makefile index 799c638..80e157b 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Makefile +++ b/firmware/func_gen_stm32f303re_nucleo/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Aug 12 13:08:17 CEST 2023] +# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Aug 12 20:39:38 CEST 2023] ########################################################################################################################## # ------------------------------------------------ @@ -78,21 +78,30 @@ C_SOURCES += ../shared_libs/drivers/mcp41x/mcp41x.c C_SOURCES += ../shared_libs/drivers/st7565/st7565.c # hw_button C_SOURCES += ../shared_libs/drivers/hw_button/hw_button.c +# led +C_SOURCES += ../shared_libs/drivers/led/led.c +# mcu_cs +C_SOURCES += ../shared_libs/drivers/mcu_cs/mcu_cs.c + # display C_SOURCES += ../shared_libs/display/display_gfx.c C_SOURCES += ../shared_libs/display/font_gfx.c + # bitmaps C_SOURCES += ../shared_libs/bitmaps/bitmap_disp_buttons.c C_SOURCES += ../shared_libs/bitmaps/bitmap_font_5x7.c C_SOURCES += ../shared_libs/bitmaps/bitmap_wave.c + # display_layout C_SOURCES += ../shared_libs/disp_layout/disp_layout.c + # controllers +C_SOURCES += ../shared_libs/controllers/ctrl_app.c C_SOURCES += ../shared_libs/controllers/ctrl_bottom_button.c C_SOURCES += ../shared_libs/controllers/ctrl_channel_button.c -C_SOURCES += ../shared_libs/controllers/ctrl_app.c +C_SOURCES += ../shared_libs/controllers/ctrl_disp_button.c C_SOURCES += ../shared_libs/controllers/ctrl_encoder.c -C_SOURCES += ../shared_libs/controllers/ctrl_generator.c +C_SOURCES += ../shared_libs/controllers/ctrl_signal_gen.c # utils/printf C_SOURCES += ../shared_libs/utils/printf/printf.c @@ -174,6 +183,10 @@ C_INCLUDES += -I../shared_libs/drivers/mcp41x C_INCLUDES += -I../shared_libs/drivers/st7565 # hw_button includes C_INCLUDES += -I../shared_libs/drivers/hw_button +# led includes +C_INCLUDES += -I../shared_libs/drivers/led +# mcu_cs includes +C_INCLUDES += -I../shared_libs/drivers/mcu_cs # display includes C_INCLUDES += -I../shared_libs/display # bitmaps includes @@ -187,6 +200,7 @@ C_INCLUDES += -I../shared_libs/controllers C_INCLUDES += -I../shared_libs/utils/printf C_INCLUDES += -I../shared_libs/utils/rtt C_INCLUDES += -I../shared_libs/utils/ulog +C_INCLUDES += -I../shared_libs/utils/spi_cs # compile gcc flags diff --git a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc index 01a5c78..0a552a1 100644 --- a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc +++ b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc @@ -9,7 +9,6 @@ Mcu.CPN=STM32F303RET6 Mcu.Family=STM32F3 Mcu.IP0=I2C1 Mcu.IP1=NVIC -Mcu.IP10=USART2 Mcu.IP2=RCC Mcu.IP3=SPI2 Mcu.IP4=SPI3 @@ -17,8 +16,8 @@ Mcu.IP5=SYS Mcu.IP6=TIM1 Mcu.IP7=TIM2 Mcu.IP8=TIM3 -Mcu.IP9=TIM17 -Mcu.IPNb=11 +Mcu.IP9=USART2 +Mcu.IPNb=10 Mcu.Name=STM32F303R(D-E)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC13 @@ -50,21 +49,19 @@ Mcu.Pin31=PC10 Mcu.Pin32=PC11 Mcu.Pin33=PC12 Mcu.Pin34=PB3 -Mcu.Pin35=PB5 -Mcu.Pin36=PB6 -Mcu.Pin37=PB7 -Mcu.Pin38=PB9 -Mcu.Pin39=VP_SYS_VS_Systick +Mcu.Pin35=PB6 +Mcu.Pin36=PB7 +Mcu.Pin37=PB9 +Mcu.Pin38=VP_SYS_VS_Systick +Mcu.Pin39=VP_TIM1_VS_ClockSourceINT Mcu.Pin4=PF1-OSC_OUT -Mcu.Pin40=VP_TIM1_VS_ClockSourceINT -Mcu.Pin41=VP_TIM2_VS_ClockSourceINT -Mcu.Pin42=VP_TIM17_VS_ClockSourceINT +Mcu.Pin40=VP_TIM2_VS_ClockSourceINT Mcu.Pin5=PC1 Mcu.Pin6=PC2 Mcu.Pin7=PC3 Mcu.Pin8=PA0 Mcu.Pin9=PA1 -Mcu.PinsNb=43 +Mcu.PinsNb=41 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F303RETx @@ -168,7 +165,6 @@ PB3.GPIOParameters=GPIO_Label PB3.GPIO_Label=SWO PB3.Locked=true PB3.Signal=SYS_JTDO-TRACESWO -PB5.Signal=S_TIM17_CH1 PB6.Locked=true PB6.Mode=I2C PB6.Signal=I2C1_SCL @@ -271,7 +267,7 @@ RCC.I2C1Freq_Value=8000000 RCC.I2C2Freq_Value=8000000 RCC.I2C3Freq_Value=8000000 RCC.I2SClocksFreq_Value=72000000 -RCC.IPParameters=ADC12outputFreq_Value,ADC34outputFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SClocksFreq_Value,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLM,PLLMCOFreq_Value,PLLMUL,PLLN,PLLP,PLLQ,RCC_MCODiv,RCC_MCOSource,RCC_PLLsource_Clock_Source_FROM_HSE,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM15Freq_Value,TIM16Freq_Value,TIM17Freq_Value,TIM1Freq_Value,TIM20Freq_Value,TIM2Freq_Value,TIM3Freq_Value,TIM8Freq_Value,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.IPParameters=ADC12outputFreq_Value,ADC34outputFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SClocksFreq_Value,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLM,PLLMCOFreq_Value,PLLMUL,PLLN,PLLP,PLLQ,RCC_MCODiv,RCC_MCOSource,RCC_PLLsource_Clock_Source_FROM_HSE,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM15Freq_Value,TIM16Freq_Value,TIM17Freq_Value,TIM1Freq_Value,TIM1Selection,TIM20Freq_Value,TIM2Freq_Value,TIM3Freq_Value,TIM8Freq_Value,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value RCC.LSI_VALUE=40000 RCC.MCOFreq_Value=9000000 RCC.PLLCLKFreq_Value=72000000 @@ -291,7 +287,8 @@ RCC.SYSCLKSourceVirtual=RCC_SYSCLKSOURCE_PLLCLK RCC.TIM15Freq_Value=72000000 RCC.TIM16Freq_Value=72000000 RCC.TIM17Freq_Value=72000000 -RCC.TIM1Freq_Value=72000000 +RCC.TIM1Freq_Value=144000000 +RCC.TIM1Selection=RCC_TIM1CLK_PLLCLK RCC.TIM20Freq_Value=72000000 RCC.TIM2Freq_Value=72000000 RCC.TIM3Freq_Value=72000000 @@ -305,8 +302,6 @@ RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 SH.GPXTI13.0=GPIO_EXTI13 SH.GPXTI13.ConfNb=1 -SH.S_TIM17_CH1.0=TIM17_CH1,PWM Generation1 CH1 -SH.S_TIM17_CH1.ConfNb=1 SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2 SH.S_TIM1_CH2.ConfNb=1 SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3 @@ -339,16 +334,10 @@ TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM1.IPParameters=Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,Channel-PWM Generation2 CH2,Period,Pulse-PWM Generation2 CH2,Pulse-PWM Generation3 CH3,Pulse-PWM Generation4 CH4,AutoReloadPreload,OCFastMode_PWM-PWM Generation4 CH4 TIM1.OCFastMode_PWM-PWM\ Generation4\ CH4=TIM_OCFAST_ENABLE -TIM1.Period=2 -TIM1.Pulse-PWM\ Generation2\ CH2=1 -TIM1.Pulse-PWM\ Generation3\ CH3=1 -TIM1.Pulse-PWM\ Generation4\ CH4=1 -TIM17.Channel=TIM_CHANNEL_1 -TIM17.IPParameters=Channel,Period,OCFastMode_PWM,OCIdleState_1,Pulse -TIM17.OCFastMode_PWM=TIM_OCFAST_ENABLE -TIM17.OCIdleState_1=TIM_OCIDLESTATE_RESET -TIM17.Period=2 -TIM17.Pulse=1 +TIM1.Period=5 +TIM1.Pulse-PWM\ Generation2\ CH2=3 +TIM1.Pulse-PWM\ Generation3\ CH3=3 +TIM1.Pulse-PWM\ Generation4\ CH4=3 TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE TIM2.IPParameters=AutoReloadPreload TIM3.IC1Filter=15 @@ -359,8 +348,6 @@ USART2.IPParameters=VirtualMode-Asynchronous USART2.VirtualMode-Asynchronous=VM_ASYNC VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick -VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer -VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT.Mode=Internal diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index bac51b8..e8eb9ac 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -1,14 +1,14 @@ #include "main.h" #include "tim.h" -#include "hw_button.h" #include "ctrl_bottom_button.h" #include "ctrl_channel_button.h" #include "ctrl_encoder.h" -#include "ctrl_generator.h" +#include "ctrl_disp_button.h" +#include "ctrl_signal_gen.h" #include "ctrl_app.h" -typedef void (*btn_action_t)(void); +typedef void (*btn_action_t)(APP_data_t *app_data); typedef struct { @@ -16,69 +16,46 @@ typedef struct BITMAP_buttonName_t bitmap_name; } CMD_button_t; -static GEN_fg_t func_gen[3]; -static GEN_pwm_t pwm_gen[3]; - static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX]; static const LAY_dispBtn_t btn_hw_to_disp[BTN_BOT_MAX] = {DISP_BTN_1, DISP_BTN_2, DISP_BTN_3, DISP_BTN_4, DISP_BTN_5}; static const GEN_channel_t btn_ch_to_chan[CHANNEL_MAX] = {CHANNEL1, CHANNEL2, CHANNEL3, CHANNEL4, CHANNEL5, CHANNEL6}; static const uint32_t pow_of_10[7] = {1, 10, 100, 1000, 10000, 100000, 1000000}; -static HW_BotBtnName_t last_key; static APP_data_t *_app_data; -static GEN_sig_t signal_gen[CHANNEL_MAX] = { - {.type = GEN_FG_TYPE, .gen = &func_gen[0]}, - {.type = GEN_FG_TYPE, .gen = &func_gen[1]}, - {.type = GEN_FG_TYPE, .gen = &func_gen[2]}, - {.type = GEN_PWM_TYPE, .gen = &pwm_gen[0]}, - {.type = GEN_PWM_TYPE, .gen = &pwm_gen[1]}, - {.type = GEN_PWM_TYPE, .gen = &pwm_gen[2]}, +static dds_gen_t dds_gen[DDS_CH_MAX] = { + {.super.type = GEN_FG_TYPE, .dds_ch = DDS_CH1}, + {.super.type = GEN_FG_TYPE, .dds_ch = DDS_CH2}, + {.super.type = GEN_FG_TYPE, .dds_ch = DDS_CH3}, +}; +static pwm_gen_t pwm_gen[PWM_CH_MAX] = { + {.super.type = GEN_PWM_TYPE, .pwm_ch = PWM_CH1}, + {.super.type = GEN_PWM_TYPE, .pwm_ch = PWM_CH2}, + {.super.type = GEN_PWM_TYPE, .pwm_ch = PWM_CH3}, }; -void _signalGenDefaultValues(void) -{ - for (GEN_channel_t channel = 0; channel < CHANNEL_MAX; channel++) - { - switch (signal_gen[channel].type) - { - case GEN_FG_TYPE: - { - GEN_fg_t *gen = signal_gen[channel].gen; - gen->frequency = 1000; - gen->amplitude = 100; - gen->offset = 165; - gen->phase = 0; - gen->wave = GEN_SIN; - gen->enabled = FALSE; - gen->link = 0; - break; - } - case GEN_PWM_TYPE: - { - GEN_pwm_t *gen = signal_gen[channel].gen; - gen->frequency = 1000; - gen->amplitude = 0; - gen->offset = 0; - gen->phase = 0; - gen->duty = 50; - gen->enabled = FALSE; - break; - } - default: - break; - } - } -} +static signal_gen_t *signal_gen[CHANNEL_MAX] = { + &dds_gen[DDS_CH1].super, + &dds_gen[DDS_CH2].super, + &dds_gen[DDS_CH3].super, + &pwm_gen[PWM_CH1].super, + &pwm_gen[PWM_CH2].super, + &pwm_gen[PWM_CH3].super, +}; -void _setGenInitailState(GEN_channel_t channel) +static void _setGenInitailState(GEN_channel_t channel); +static void _signalGenDefaultValues(void); +static void _changeValueDdsGen(int8_t dir); +static void _changeValuePwmGen(int8_t dir); + +//**************************** +// Initialization +//**************************** + +void CTRL_buttonsInit(void) { - setFreq(&signal_gen[channel], channel); - setWave(&signal_gen[channel], channel); - setPhase(&signal_gen[channel], channel); - setAmplitude(&signal_gen[channel], channel); - setEnabled(&signal_gen[channel], channel); - // setOfsset(&signal_gen[channel], channel); + CTRL_bottomButtonInit(); + CTRL_channelButtonInit(); } void APP_init(APP_data_t *app_data) @@ -90,32 +67,29 @@ void APP_init(APP_data_t *app_data) _app_data->phas_focus_digit = 0; _app_data->duty_focus_digit = 0; - _app_data->curr_gen_type = signal_gen[CHANNEL1].type; - _app_data->curr_gen = signal_gen[CHANNEL1].gen; + _app_data->curr_gen = signal_gen[CHANNEL1]; _app_data->curr_state_lay = LAY_MAIN; _app_data->curr_state_btn = BTN_MAIN_FG; _app_data->curr_channel = CHANNEL1; - _app_data->isChannelChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; - _app_data->isButtonChange = 1; - _app_data->isButtonBlink = 1; + // _app_data->isChannelChange = 1; + // _app_data->isGraphChange = 1; + // _app_data->isValueChange = 1; + // _app_data->isButtonChange = 1; + // _app_data->isButtonBlink = 1; + _app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE | UPDATE_CHANNEL; - _signalGenDefaultValues(); CTRL_buttonsInit(); - gen_init(); + _signalGenDefaultValues(); + GEN_init(signal_gen); _setGenInitailState(CHANNEL1); _setGenInitailState(CHANNEL2); } -void CTRL_buttonsInit(void) -{ - - CTRL_bottomButtonInit(); - CTRL_channelButtonInit(); -} +//**************************** +// Handlers +//**************************** void CTRL_buttonsHandler(void) { @@ -124,11 +98,33 @@ void CTRL_buttonsHandler(void) CTRL_encoderHandler(); } +//**************************** +// Events +//**************************** + void CTRL_pushedDispBtnEvent(ButtonKey_t *key) { ULOG_TRACE("Disp btn: %d", key->instance); - last_key = btn_hw_to_disp[key->instance]; - btn_command[_app_data->curr_state_btn][last_key].command(); + _app_data->last_key = btn_hw_to_disp[key->instance]; + btn_command[_app_data->curr_state_btn][_app_data->last_key].command(_app_data); +} + +void CTRL_encoderEvent(int8_t enc) +{ + ULOG_TRACE("Enco event: %i", enc); + switch (_app_data->curr_gen->type) + { + case GEN_FG_TYPE: + _changeValueDdsGen(enc / 2); + break; + case GEN_PWM_TYPE: + _changeValuePwmGen(enc / 2); + break; + + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, _app_data->curr_gen->type); + break; + } } void CTRL_pushedChanBtnEvent(ButtonKey_t *key) @@ -136,18 +132,18 @@ void CTRL_pushedChanBtnEvent(ButtonKey_t *key) ULOG_TRACE("Chan btn: %d", key->instance); GEN_channel_t channel = btn_ch_to_chan[key->instance]; - _app_data->curr_gen_type = signal_gen[channel].type; - _app_data->curr_gen = signal_gen[channel].gen; + _app_data->curr_gen = signal_gen[channel]; _app_data->curr_state_lay = LAY_MAIN; _app_data->curr_state_btn = BTN_MAIN_FG; _app_data->curr_channel = channel; - _app_data->isChannelChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; - _app_data->isButtonChange = 1; - _app_data->isButtonBlink = 1; + // _app_data->isChannelChange = 1; + // _app_data->isGraphChange = 1; + // _app_data->isValueChange = 1; + // _app_data->isButtonChange = 1; + // _app_data->isButtonBlink = 1; + _app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE | UPDATE_CHANNEL; } void CTRL_longPushedChanBtnEvent(ButtonKey_t *key) @@ -155,87 +151,82 @@ void CTRL_longPushedChanBtnEvent(ButtonKey_t *key) ULOG_TRACE("Chan btn(long): %d", key->instance); GEN_channel_t channel = btn_ch_to_chan[key->instance]; - if (channel == CHANNEL2) - { - if (HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1) == HAL_ERROR) - { - HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1); - } - } - - switch (signal_gen[channel].type) + switch (signal_gen[channel]->type) { case GEN_FG_TYPE: { - GEN_fg_t *gen = signal_gen[channel].gen; - gen->enabled = gen->enabled ? FALSE : TRUE; - setEnabled(&signal_gen[channel], channel); + dds_gen_t *dds_gen = (dds_gen_t *)signal_gen[channel]; + dds_gen->settings.enabled = dds_gen->settings.enabled ? FALSE : TRUE; + setEnabled(signal_gen[channel]); break; } case GEN_PWM_TYPE: { - GEN_pwm_t *gen = signal_gen[channel].gen; - gen->enabled = gen->enabled ? FALSE : TRUE; - setEnabled(&signal_gen[channel], channel); + pwm_gen_t *pwm_gen = (pwm_gen_t *)signal_gen[channel]; + pwm_gen->settings.enabled = pwm_gen->settings.enabled ? FALSE : TRUE; + setEnabled(signal_gen[channel]); break; } default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, _app_data->curr_gen->type); break; } } -static void _changeValueFunGen(int8_t dir) +//******************************************************************* + +static void _changeValueDdsGen(int8_t dir) { - GEN_fg_t *gen = (GEN_fg_t *)_app_data->curr_gen; + dds_gen_t *dds_gen = (dds_gen_t *)_app_data->curr_gen; switch (_app_data->curr_state_lay) { case LAY_FREQ: { - uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + gen->frequency; + uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + dds_gen->settings.frequency; ULOG_DEBUG(" New freq: %lu", new_freq); if (new_freq > MAX_FREQ) { return; } - gen->frequency = new_freq; - setFreq(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); + dds_gen->settings.frequency = new_freq; + setFrequency(&dds_gen->super); break; } case LAY_AMPL: { - uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + gen->amplitude; + uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + dds_gen->settings.amplitude; ULOG_DEBUG(" New ampl: %u", new_ampl); - if (gen->offset + new_ampl > MAX_VOLT_POS || gen->offset - new_ampl < MAX_VOLT_NEG) + if (dds_gen->settings.offset + new_ampl > MAX_VOLT_POS || dds_gen->settings.offset - new_ampl < MAX_VOLT_NEG) { return; } - gen->amplitude = new_ampl; - setAmplitude(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); + dds_gen->settings.amplitude = new_ampl; + setAmplitude(&dds_gen->super); break; } case LAY_OFFS: { - int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + gen->offset; + int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + dds_gen->settings.offset; ULOG_DEBUG(" New offs: %i", new_offs); - if (new_offs + gen->amplitude > MAX_VOLT_POS || new_offs - gen->amplitude < MAX_VOLT_NEG) + if (new_offs + dds_gen->settings.amplitude > MAX_VOLT_POS || new_offs - dds_gen->settings.amplitude < MAX_VOLT_NEG) { return; } - gen->offset = new_offs; - setOfsset(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); + dds_gen->settings.offset = new_offs; + setOfsset(&dds_gen->super); break; } case LAY_PHAS: { - uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + gen->phase; + uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + dds_gen->settings.phase; ULOG_DEBUG(" New phas: %u", new_phas); if (new_phas > MAX_PHAS) { return; } - gen->phase = new_phas; - setPhase(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); + dds_gen->settings.phase = new_phas; + setPhase(&dds_gen->super); break; } default: @@ -243,72 +234,73 @@ static void _changeValueFunGen(int8_t dir) return; } - _app_data->isValueChange = 1; - _app_data->isGraphChange = 1; + // _app_data->isValueChange = 1; + // _app_data->isGraphChange = 1; + _app_data->disp_update |= UPDATE_GRAPH | UPDATE_VALUE; } static void _changeValuePwmGen(int8_t dir) { - GEN_pwm_t *gen = (GEN_pwm_t *)_app_data->curr_gen; + pwm_gen_t *pwm_gen = (pwm_gen_t *)_app_data->curr_gen; switch (_app_data->curr_state_lay) { case LAY_FREQ: { - uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + gen->frequency; + uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + pwm_gen->settings.frequency; ULOG_DEBUG(" New freq: %lu", new_freq); if (new_freq > MAX_FREQ) { return; } - gen->frequency = new_freq; + pwm_gen->settings.frequency = new_freq; break; } case LAY_AMPL: { - uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + gen->amplitude; + uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + pwm_gen->settings.amplitude; ULOG_DEBUG(" New ampl: %u", new_ampl); - if (gen->offset + new_ampl > MAX_VOLT_POS || gen->offset - new_ampl < MAX_VOLT_NEG) + if (pwm_gen->settings.offset + new_ampl > MAX_VOLT_POS || pwm_gen->settings.offset - new_ampl < MAX_VOLT_NEG) { return; } - gen->amplitude = new_ampl; + pwm_gen->settings.amplitude = new_ampl; break; } case LAY_OFFS: { - int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + gen->offset; + int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + pwm_gen->settings.offset; ULOG_DEBUG(" New offs: %i", new_offs); - if (new_offs + gen->amplitude > MAX_VOLT_POS || new_offs - gen->amplitude < MAX_VOLT_NEG) + if (new_offs + pwm_gen->settings.amplitude > MAX_VOLT_POS || new_offs - pwm_gen->settings.amplitude < MAX_VOLT_NEG) { return; } - gen->offset = new_offs; + pwm_gen->settings.offset = new_offs; break; } case LAY_PHAS: { - uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + gen->phase; + uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + pwm_gen->settings.phase; ULOG_DEBUG(" New phas: %u", new_phas); if (new_phas > MAX_PHAS) { return; } - gen->phase = new_phas; + pwm_gen->settings.phase = new_phas; break; } case LAY_DUTY: { - uint8_t new_duty = dir * pow_of_10[_app_data->duty_focus_digit] + gen->duty; + uint8_t new_duty = dir * pow_of_10[_app_data->duty_focus_digit] + pwm_gen->settings.duty; ULOG_DEBUG(" New duty: %u", new_duty); if (new_duty > MAX_DUTY) { return; } - gen->duty = new_duty; + pwm_gen->settings.duty = new_duty; break; } default: @@ -316,343 +308,142 @@ static void _changeValuePwmGen(int8_t dir) return; } - _app_data->isValueChange = 1; - _app_data->isGraphChange = 1; + // _app_data->isValueChange = 1; + // _app_data->isGraphChange = 1; + _app_data->disp_update |= UPDATE_GRAPH | UPDATE_VALUE; } -void CTRL_encoderEvent(int8_t enc) +void _signalGenDefaultValues(void) { - ULOG_TRACE("Enco event: %i", enc); - switch (_app_data->curr_gen_type) + for (GEN_channel_t channel = CHANNEL1; channel < CHANNEL_MAX; channel++) { - case GEN_FG_TYPE: - _changeValueFunGen(enc / 2); - break; - case GEN_PWM_TYPE: - _changeValuePwmGen(enc / 2); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, _app_data->curr_gen_type); - break; + switch (signal_gen[channel]->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)signal_gen[channel]; + dds_gen->settings.frequency = 1000; + dds_gen->settings.amplitude = 100; + dds_gen->settings.offset = 165; + dds_gen->settings.phase = 0; + dds_gen->settings.wave = GEN_SIN; + dds_gen->settings.link = 0; + dds_gen->settings.enabled = FALSE; + break; + } + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)signal_gen[channel]; + pwm_gen->settings.frequency = 1000; + pwm_gen->settings.amplitude = 100; + pwm_gen->settings.offset = 0; + pwm_gen->settings.phase = 0; + pwm_gen->settings.duty = 50; + pwm_gen->settings.link = 0; + pwm_gen->settings.enabled = FALSE; + break; + } + default: + break; + } } } +void _setGenInitailState(GEN_channel_t channel) +{ + setFrequency(signal_gen[channel]); + setWave(signal_gen[channel]); + setPhase(signal_gen[channel]); + setAmplitude(signal_gen[channel]); + setEnabled(signal_gen[channel]); + // setOfsset(signal_gen[channel]); +} + inline BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn) { return btn_command[_app_data->curr_state_btn][disp_btn].bitmap_name; } -static void _doNoting(void) -{ - return; -} - -static void _backToMain(void) -{ - _app_data->curr_state_lay = LAY_MAIN; - - switch (_app_data->curr_gen_type) - { - case GEN_FG_TYPE: - _app_data->curr_state_btn = BTN_MAIN_FG; - break; - - case GEN_PWM_TYPE: - _app_data->curr_state_btn = BTN_MAIN_PWM; - break; - - default: - break; - } - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; - _app_data->isGraphChange = 1; -} - -static void _blockFocusAtMaxAndMin(void) -{ - switch (_app_data->curr_state_btn) - { - case BTN_FREQ_MIN: - if (_app_data->freq_focus_digit > 0) - { - _app_data->curr_state_btn = BTN_FREQ; - _app_data->isButtonChange = 1; - } - break; - case BTN_FREQ_MAX: - if (_app_data->freq_focus_digit < FUN_GEN_FOCUS_MAX) - { - _app_data->curr_state_btn = BTN_FREQ; - _app_data->isButtonChange = 1; - } - break; - case BTN_FREQ: - if (_app_data->freq_focus_digit == 0) - { - _app_data->curr_state_btn = BTN_FREQ_MIN; - _app_data->isButtonChange = 1; - } - else if (_app_data->freq_focus_digit == FUN_GEN_FOCUS_MAX) - { - _app_data->curr_state_btn = BTN_FREQ_MAX; - _app_data->isButtonChange = 1; - } - break; - default: - break; - } -} - -static void _enterToFreqLayout(void) -{ - _app_data->curr_state_lay = LAY_FREQ; - _app_data->curr_state_btn = BTN_FREQ; - _blockFocusAtMaxAndMin(); - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; -} - -static void _enterToAmplLayout(void) -{ - _app_data->curr_state_lay = LAY_AMPL; - _app_data->curr_state_btn = BTN_AMPL; - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; -} - -static void _enterToOffslLayout(void) -{ - _app_data->curr_state_lay = LAY_OFFS; - _app_data->curr_state_btn = BTN_OFFS; - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; -} - -static void _enterToPhasLayout(void) -{ - _app_data->curr_state_lay = LAY_PHAS; - _app_data->curr_state_btn = BTN_PHAS; - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; -} - -static void _enterToDutyLayout(void) -{ - _app_data->curr_state_lay = LAY_DUTY; - _app_data->curr_state_btn = BTN_DUTY; - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; -} - -static void _enterToWavelLayout(void) -{ - _app_data->curr_state_lay = LAY_WAVE; - _app_data->curr_state_btn = BTN_WAVE; - - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; -} - -static void _moveToLeftFocusFreqNumber(void) -{ - _app_data->freq_focus_digit += 1; - _app_data->isValueChange = 1; - - _blockFocusAtMaxAndMin(); - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); -} - -static void _moveToRighttFocusFreqNumber(void) -{ - _app_data->freq_focus_digit -= 1; - _app_data->isValueChange = 1; - - _blockFocusAtMaxAndMin(); - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); -} - -static void _setTo0_01xFocusNumber(void) -{ - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 0; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 0; - break; - default: - break; - } - - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; -} -static void _setTo0_1xFocusNumber(void) -{ - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 1; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 1; - break; - default: - break; - } - - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; -} -static void _setTo1xFocusNumber(void) -{ - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 2; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 2; - break; - case LAY_PHAS: - _app_data->phas_focus_digit = 0; - break; - case LAY_DUTY: - _app_data->duty_focus_digit = 0; - break; - default: - break; - } - - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; -} -static void _setTo10xFocusNumber(void) -{ - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 3; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 3; - break; - case LAY_PHAS: - _app_data->phas_focus_digit = 1; - break; - case LAY_DUTY: - _app_data->duty_focus_digit = 1; - break; - default: - break; - } - - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; -} - static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX] = { { // BTN_MAIN_FG - {_enterToFreqLayout, BITMAP_BTN_FREQ}, - {_enterToAmplLayout, BITMAP_BTN_AMPL}, - {_enterToOffslLayout, BITMAP_BTN_OFFS}, - {_enterToPhasLayout, BITMAP_BTN_PHAS}, - {_enterToWavelLayout, BITMAP_BTN_WAVE}, + {enterToFreqLayout, BITMAP_BTN_FREQ}, + {enterToAmplLayout, BITMAP_BTN_AMPL}, + {enterToOffslLayout, BITMAP_BTN_OFFS}, + {enterToPhasLayout, BITMAP_BTN_PHAS}, + {enterToWavelLayout, BITMAP_BTN_WAVE}, }, { // BTN_MAIN_PWM - {_enterToFreqLayout, BITMAP_BTN_FREQ}, - {_enterToAmplLayout, BITMAP_BTN_AMPL}, - {_enterToOffslLayout, BITMAP_BTN_OFFS}, - {_enterToPhasLayout, BITMAP_BTN_PHAS}, - {_enterToDutyLayout, BITMAP_BTN_NONE}, + {enterToFreqLayout, BITMAP_BTN_FREQ}, + {enterToAmplLayout, BITMAP_BTN_AMPL}, + {enterToOffslLayout, BITMAP_BTN_OFFS}, + {enterToPhasLayout, BITMAP_BTN_PHAS}, + {enterToDutyLayout, BITMAP_BTN_NONE}, }, { // BTN_FREQ - {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, - {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, + {moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_FREQ_MIN - {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, - {_doNoting, BITMAP_BTN_EMPTY}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, + {doNoting, BITMAP_BTN_EMPTY}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_FREQ_MAX - {_doNoting, BITMAP_BTN_EMPTY}, - {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {doNoting, BITMAP_BTN_EMPTY}, + {moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_AMPL - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, - {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {setTo1xFocusNumber, BITMAP_BTN_X1}, + {setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, + {setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_OFFS - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, - {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {setTo1xFocusNumber, BITMAP_BTN_X1}, + {setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, + {setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_PHAS - {_setTo10xFocusNumber, BITMAP_BTN_X10}, - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {setTo10xFocusNumber, BITMAP_BTN_X10}, + {setTo1xFocusNumber, BITMAP_BTN_X1}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_DUTY - {_setTo10xFocusNumber, BITMAP_BTN_X10}, - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {setTo10xFocusNumber, BITMAP_BTN_X10}, + {setTo1xFocusNumber, BITMAP_BTN_X1}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, { // BTN_WAVE - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {doNoting, BITMAP_BTN_NONE}, + {backToMain, BITMAP_BTN_BACK}, }, -}; +}; \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_app.h b/firmware/shared_libs/controllers/ctrl_app.h index 21dcda1..2521866 100644 --- a/firmware/shared_libs/controllers/ctrl_app.h +++ b/firmware/shared_libs/controllers/ctrl_app.h @@ -3,56 +3,6 @@ #include "bitmap_disp_buttons.h" #include "ctrl_app_types.h" -typedef struct -{ - uint32_t frequency; - uint16_t amplitude; - int16_t offset; - uint16_t phase; - uint8_t duty; - uint8_t enabled; -} GEN_pwm_t; - -typedef struct -{ - uint32_t frequency; - uint16_t amplitude; - int16_t offset; - uint16_t phase; - uint8_t wave; - uint8_t enabled; - uint8_t link; -} GEN_fg_t; - -typedef struct -{ - GEN_type_t type; - void *const gen; -} GEN_sig_t; - -typedef struct -{ - uint8_t freq_focus_digit; - uint8_t ampl_focus_digit; - uint8_t offs_focus_digit; - uint8_t phas_focus_digit; - uint8_t duty_focus_digit; - - GEN_type_t curr_gen_type; - void *curr_gen; - - GEN_channel_t curr_channel; - STATE_layout_t curr_state_lay; - STATE_button_t curr_state_btn; - - uint8_t isChannelChange; - uint8_t isGraphChange; - uint8_t isValueChange; - uint8_t isButtonChange; - uint8_t isButtonBlink; - uint8_t timer_blink[DISP_BTN_MAX]; - -} APP_data_t; void APP_init(APP_data_t *app_data); void CTRL_buttonsInit(void); diff --git a/firmware/shared_libs/controllers/ctrl_app_defs.h b/firmware/shared_libs/controllers/ctrl_app_defs.h new file mode 100644 index 0000000..e953ce9 --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_app_defs.h @@ -0,0 +1,124 @@ +#pragma once + +#define FUN_GEN_FOCUS_MAX 6U +#define PWM_GEN_FOCUS_MAX 4U +#define MAX_FREQ 1000000U +#define MAX_VOLT_POS 360 +#define MAX_VOLT_NEG 0 +#define MAX_PHAS 360 +#define MAX_DUTY 100 + +typedef enum +{ + FALSE, + TRUE +} bool_t; + +typedef enum +{ + GEN_FG_TYPE, + GEN_PWM_TYPE, + GEN_TYPE_MAX +} GEN_type_t; + +typedef enum +{ + DDS_CH1, + DDS_CH2, + DDS_CH3, + DDS_CH_MAX, +} DDS_channel_t; + +typedef enum +{ + PWM_CH1, + PWM_CH2, + PWM_CH3, + PWM_CH_MAX, +} PWM_channel_t; + +typedef enum +{ + CHANNEL1, + CHANNEL2, + CHANNEL3, + CHANNEL4, + CHANNEL5, + CHANNEL6, + CHANNEL_MAX +} GEN_channel_t; + +typedef enum +{ + GEN_SIN, + GEN_TRI, + GEN_SQR, + GEN_WAVE_MAX, +} GEN_wave_t; + +typedef enum +{ + LAY_MAIN, + LAY_FREQ, + LAY_AMPL, + LAY_OFFS, + LAY_PHAS, + LAY_DUTY, + LAY_WAVE, + LAY_STATE_MAX +} STATE_layout_t; + +typedef enum +{ + BTN_MAIN_FG, + BTN_MAIN_PWM, + BTN_FREQ, + BTN_FREQ_MIN, + BTN_FREQ_MAX, + BTN_AMPL, + BTN_OFFS, + BTN_PHAS, + BTN_DUTY, + BTN_WAVE, + BTN_STATE_MAX +} STATE_button_t; + +typedef enum +{ + DISP_BTN_1, + DISP_BTN_2, + DISP_BTN_3, + DISP_BTN_4, + DISP_BTN_5, + DISP_BTN_MAX, +} LAY_dispBtn_t; + +typedef enum +{ + UPDATE_CHANNEL = 1, + UPDATE_GRAPH = 2, + UPDATE_VALUE = 4, + UPDATE_BUTTON = 8, + UPDATE_ALL = 15, +} LAY_update_t; + +typedef enum +{ + FREQ_LINK1 = 1, + FREQ_LINK2 = 2, + AMPL_LINK1 = 4, + AMPL_LINK2 = 8, + OFFS_LINK1 = 16, + OFFS_LINK2 = 32, + PHAS_LINK1 = 64, + PHAS_LINK2 = 128, +} GEN_linkMask_t; + +typedef enum +{ + MCU_CS1, + MCU_CS2, + MCU_CS3, + MCU_CS4, + MCU_CS_MAX, +} MCU_cs_count_t; \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_app_types.h b/firmware/shared_libs/controllers/ctrl_app_types.h index 2a5338c..9c9c7d2 100644 --- a/firmware/shared_libs/controllers/ctrl_app_types.h +++ b/firmware/shared_libs/controllers/ctrl_app_types.h @@ -1,78 +1,106 @@ #pragma once +#include "main.h" +#include "ad9833.h" +#include "mcp41x.h" +#include "ltc2631.h" +#include "ctrl_app_defs.h" -#define FUN_GEN_FOCUS_MAX 6U -#define PWM_GEN_FOCUS_MAX 4U -#define MAX_FREQ 1000000U -#define MAX_VOLT_POS 360 -#define MAX_VOLT_NEG 0 -#define MAX_PHAS 360 -#define MAX_DUTY 100 - -typedef enum +typedef struct { - FALSE, - TRUE -} bool_t; + uint32_t frequency; + uint16_t amplitude; + int16_t offset; + uint16_t phase; + uint8_t duty; + uint8_t link; + bool_t enabled; +} pwm_settings_t; -typedef enum +typedef struct { - GEN_FG_TYPE, - GEN_PWM_TYPE, - GEN_TYPE_MAX -} GEN_type_t; + uint32_t frequency; + uint16_t amplitude; + int16_t offset; + uint16_t phase; + uint8_t wave; + uint8_t link; + uint8_t enabled; +} dds_settings_t; -typedef enum +typedef struct { - CHANNEL1, - CHANNEL2, - CHANNEL3, - CHANNEL4, - CHANNEL5, - CHANNEL6, - CHANNEL_MAX -} GEN_channel_t; + GPIO_TypeDef *port; + uint16_t pin; +} led_handle_t; -typedef enum +typedef struct FG_handle_s { - GEN_SIN, - GEN_TRI, - GEN_SQR, - GEN_WAVE_MAX, -} GEN_wave_t; + ad9833_handle_t hdds; + ltc2631_handle_t hoffs; + mcp41x_handle_t hampl; + led_handle_t hled; +} dds_handle_t; -typedef enum +typedef uint8_t timer_handle_t; +typedef struct { - LAY_MAIN, - LAY_FREQ, - LAY_AMPL, - LAY_OFFS, - LAY_PHAS, - LAY_DUTY, - LAY_WAVE, - LAY_STATE_MAX -} STATE_layout_t; + timer_handle_t hpwm; + ltc2631_handle_t hoffs; + mcp41x_handle_t hampl; + led_handle_t hled; +} pwm_handle_t; -typedef enum +typedef struct { - BTN_MAIN_FG, - BTN_MAIN_PWM, - BTN_FREQ, - BTN_FREQ_MIN, - BTN_FREQ_MAX, - BTN_AMPL, - BTN_OFFS, - BTN_PHAS, - BTN_DUTY, - BTN_WAVE, - BTN_STATE_MAX -} STATE_button_t; + GEN_type_t const type; +} signal_gen_t; -typedef enum +typedef struct { - DISP_BTN_1, - DISP_BTN_2, - DISP_BTN_3, - DISP_BTN_4, - DISP_BTN_5, - DISP_BTN_MAX, -} LAY_dispBtn_t; + signal_gen_t *next; + signal_gen_t *prev; +} link_t; + +typedef struct +{ + signal_gen_t super; + DDS_channel_t const dds_ch; + dds_settings_t settings; + dds_handle_t handle; + link_t link; +} dds_gen_t; + +typedef struct +{ + signal_gen_t super; + PWM_channel_t const pwm_ch; + pwm_settings_t settings; + pwm_handle_t handle; + link_t link; +} pwm_gen_t; + +typedef struct +{ + uint8_t freq_focus_digit; + uint8_t ampl_focus_digit; + uint8_t offs_focus_digit; + uint8_t phas_focus_digit; + uint8_t duty_focus_digit; + + signal_gen_t *curr_gen; + + GEN_channel_t curr_channel; + STATE_layout_t curr_state_lay; + STATE_button_t curr_state_btn; + + // uint8_t isChannelChange; + // uint8_t isGraphChange; + // uint8_t isValueChange; + // uint8_t isButtonChange; + LAY_update_t disp_update; + uint8_t button_blink; + uint8_t timer_blink[DISP_BTN_MAX]; + + LAY_dispBtn_t last_key; + +} APP_data_t; diff --git a/firmware/shared_libs/controllers/ctrl_bottom_button.c b/firmware/shared_libs/controllers/ctrl_bottom_button.c index 135be15..1cc6b9f 100644 --- a/firmware/shared_libs/controllers/ctrl_bottom_button.c +++ b/firmware/shared_libs/controllers/ctrl_bottom_button.c @@ -1,6 +1,4 @@ #include "main.h" -#include "hw_button.h" -// #include "ctrl_app.h" #include "ctrl_bottom_button.h" static ButtonKey_t bottom_buttons[BTN_BOT_MAX]; diff --git a/firmware/shared_libs/controllers/ctrl_bottom_button.h b/firmware/shared_libs/controllers/ctrl_bottom_button.h index c987bee..5ed0f8a 100644 --- a/firmware/shared_libs/controllers/ctrl_bottom_button.h +++ b/firmware/shared_libs/controllers/ctrl_bottom_button.h @@ -1,5 +1,7 @@ #pragma once +#include "hw_button.h" + typedef enum { BTN_BOT_1, diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.c b/firmware/shared_libs/controllers/ctrl_channel_button.c index 2f910ec..2fc87be 100644 --- a/firmware/shared_libs/controllers/ctrl_channel_button.c +++ b/firmware/shared_libs/controllers/ctrl_channel_button.c @@ -1,5 +1,4 @@ #include "main.h" -#include "hw_button.h" #include "ctrl_channel_button.h" #define DUMMY_GPIO_Port B1_GPIO_Port diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.h b/firmware/shared_libs/controllers/ctrl_channel_button.h index 4402bba..9d7a34c 100644 --- a/firmware/shared_libs/controllers/ctrl_channel_button.h +++ b/firmware/shared_libs/controllers/ctrl_channel_button.h @@ -1,5 +1,7 @@ #pragma once +#include "hw_button.h" + typedef enum { BTN_CH_1, diff --git a/firmware/shared_libs/controllers/ctrl_disp_button.c b/firmware/shared_libs/controllers/ctrl_disp_button.c new file mode 100644 index 0000000..b9ca0e2 --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_disp_button.c @@ -0,0 +1,244 @@ +#include "ctrl_disp_button.h" + +void doNoting(APP_data_t *app_data) +{ + return; +} + +void backToMain(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_MAIN; + + switch (app_data->curr_gen->type) + { + case GEN_FG_TYPE: + app_data->curr_state_btn = BTN_MAIN_FG; + break; + + case GEN_PWM_TYPE: + app_data->curr_state_btn = BTN_MAIN_PWM; + break; + + default: + break; + } + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + // app_data->isGraphChange = 1; + app_data->disp_update = UPDATE_ALL; +} + +void blockFocusAtMaxAndMin(APP_data_t *app_data) +{ + switch (app_data->curr_state_btn) + { + case BTN_FREQ_MIN: + if (app_data->freq_focus_digit > 0) + { + app_data->curr_state_btn = BTN_FREQ; + app_data->disp_update |= UPDATE_BUTTON; + } + break; + case BTN_FREQ_MAX: + if (app_data->freq_focus_digit < FUN_GEN_FOCUS_MAX) + { + app_data->curr_state_btn = BTN_FREQ; + app_data->disp_update |= UPDATE_BUTTON; + } + break; + case BTN_FREQ: + if (app_data->freq_focus_digit == 0) + { + app_data->curr_state_btn = BTN_FREQ_MIN; + app_data->disp_update |= UPDATE_BUTTON; + } + else if (app_data->freq_focus_digit == FUN_GEN_FOCUS_MAX) + { + app_data->curr_state_btn = BTN_FREQ_MAX; + app_data->disp_update |= UPDATE_BUTTON; + } + break; + default: + break; + } +} + +void enterToFreqLayout(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_FREQ; + app_data->curr_state_btn = BTN_FREQ; + blockFocusAtMaxAndMin(app_data); + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE; +} + +void enterToAmplLayout(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_AMPL; + app_data->curr_state_btn = BTN_AMPL; + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE; +} + +void enterToOffslLayout(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_OFFS; + app_data->curr_state_btn = BTN_OFFS; + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE; +} + +void enterToPhasLayout(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_PHAS; + app_data->curr_state_btn = BTN_PHAS; + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE; +} + +void enterToDutyLayout(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_DUTY; + app_data->curr_state_btn = BTN_DUTY; + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE; +} + +void enterToWavelLayout(APP_data_t *app_data) +{ + app_data->curr_state_lay = LAY_WAVE; + app_data->curr_state_btn = BTN_WAVE; + + // app_data->isButtonChange = 1; + // app_data->isGraphChange = 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE; +} + +void moveToLeftFocusFreqNumber(APP_data_t *app_data) +{ + app_data->freq_focus_digit += 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_VALUE; + + blockFocusAtMaxAndMin(app_data); + app_data->timer_blink[app_data->last_key] = 2; + app_data->button_blink |= (1 << app_data->last_key); +} + +void moveToRighttFocusFreqNumber(APP_data_t *app_data) +{ + app_data->freq_focus_digit -= 1; + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_VALUE; + + blockFocusAtMaxAndMin(app_data); + app_data->timer_blink[app_data->last_key] = 2; + app_data->button_blink |= (1 << app_data->last_key); +} + +void setTo0_01xFocusNumber(APP_data_t *app_data) +{ + switch (app_data->curr_state_lay) + { + case LAY_AMPL: + app_data->ampl_focus_digit = 0; + break; + case LAY_OFFS: + app_data->offs_focus_digit = 0; + break; + default: + break; + } + + app_data->timer_blink[app_data->last_key] = 2; + app_data->button_blink |= (1 << app_data->last_key); + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_VALUE; +} +void setTo0_1xFocusNumber(APP_data_t *app_data) +{ + switch (app_data->curr_state_lay) + { + case LAY_AMPL: + app_data->ampl_focus_digit = 1; + break; + case LAY_OFFS: + app_data->offs_focus_digit = 1; + break; + default: + break; + } + + app_data->timer_blink[app_data->last_key] = 2; + app_data->button_blink |= (1 << app_data->last_key); + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_VALUE; +} +void setTo1xFocusNumber(APP_data_t *app_data) +{ + switch (app_data->curr_state_lay) + { + case LAY_AMPL: + app_data->ampl_focus_digit = 2; + break; + case LAY_OFFS: + app_data->offs_focus_digit = 2; + break; + case LAY_PHAS: + app_data->phas_focus_digit = 0; + break; + case LAY_DUTY: + app_data->duty_focus_digit = 0; + break; + default: + break; + } + + app_data->timer_blink[app_data->last_key] = 2; + app_data->button_blink |= (1 << app_data->last_key); + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_VALUE; +} +void setTo10xFocusNumber(APP_data_t *app_data) +{ + switch (app_data->curr_state_lay) + { + case LAY_AMPL: + app_data->ampl_focus_digit = 3; + break; + case LAY_OFFS: + app_data->offs_focus_digit = 3; + break; + case LAY_PHAS: + app_data->phas_focus_digit = 1; + break; + case LAY_DUTY: + app_data->duty_focus_digit = 1; + break; + default: + break; + } + + app_data->timer_blink[app_data->last_key] = 2; + app_data->button_blink |= (1 << app_data->last_key); + // app_data->isValueChange = 1; + app_data->disp_update |= UPDATE_VALUE; +} diff --git a/firmware/shared_libs/controllers/ctrl_disp_button.h b/firmware/shared_libs/controllers/ctrl_disp_button.h new file mode 100644 index 0000000..fe4993c --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_disp_button.h @@ -0,0 +1,18 @@ +#pragma once +#include "ctrl_app_types.h" + +void doNoting(APP_data_t *app_data); +void backToMain(APP_data_t *app_data); +void blockFocusAtMaxAndMin(APP_data_t *app_data); +void enterToFreqLayout(APP_data_t *app_data); +void enterToAmplLayout(APP_data_t *app_data); +void enterToOffslLayout(APP_data_t *app_data); +void enterToPhasLayout(APP_data_t *app_data); +void enterToDutyLayout(APP_data_t *app_data); +void enterToWavelLayout(APP_data_t *app_data); +void moveToLeftFocusFreqNumber(APP_data_t *app_data); +void moveToRighttFocusFreqNumber(APP_data_t *app_data); +void setTo0_01xFocusNumber(APP_data_t *app_data); +void setTo0_1xFocusNumber(APP_data_t *app_data); +void setTo1xFocusNumber(APP_data_t *app_data); +void setTo10xFocusNumber(APP_data_t *app_data); \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_generator.c b/firmware/shared_libs/controllers/ctrl_generator.c deleted file mode 100644 index 451ee49..0000000 --- a/firmware/shared_libs/controllers/ctrl_generator.c +++ /dev/null @@ -1,306 +0,0 @@ -#include "main.h" -#include "spi.h" -#include "i2c.h" -#include "ctrl_app_types.h" -#include "ad9833.h" -#include "ltc2631.h" -#include "mcp41x.h" -#include "ctrl_generator.h" - -typedef struct FG_handle_s FG_handle_t; - -typedef struct -{ - GPIO_TypeDef *port; - uint16_t pin; -} GEN_led_t; - -struct FG_handle_s -{ - ad9833_handle_t hdds; - ltc2631_handle_t hoffs; - mcp41x_handle_t hampl; - FG_handle_t *link[2]; - GEN_led_t hled; -}; - -typedef uint8_t timer_handle_t; -typedef struct -{ - timer_handle_t hpwm; - ltc2631_handle_t hoffs; - mcp41x_handle_t hampl; - GEN_led_t hled; -} PWM_handle_t; - -typedef enum -{ - FG_CHAN1, - FG_CHAN2, - FG_CHAN3, - FG_CHAN_MAX, -} FG_channel_t; - -typedef enum -{ - PWM_CHAN1, - PWM_CHAN2, - PWM_CHAN3, - PWM_CHAN_MAX, -} PWM_channel_t; - -FG_handle_t dds_gen[FG_CHAN_MAX]; -PWM_handle_t pwm_gen[PWM_CHAN_MAX]; - -uint8_t ch_to_gen_ch[CHANNEL_MAX] = {FG_CHAN1, FG_CHAN2, FG_CHAN3, PWM_CHAN1, PWM_CHAN2, PWM_CHAN3}; - -// #define DDS1_CS_PORT GPIOC -// #define DDS2_CS_PORT GPIOC -// #define DDS3_CS_PORT GPIOC - -// #define DDS1_CS_PIN GPIO_PIN_0 -// #define DDS2_CS_PIN GPIO_PIN_0 -// #define DDS3_CS_PIN GPIO_PIN_0 - -// #define AMP1_CS_PORT GPIOC -// #define AMP2_CS_PORT GPIOC -// #define AMP3_CS_PORT GPIOC - -// #define AMP1_CS_PIN GPIO_PIN_0 -// #define AMP2_CS_PIN GPIO_PIN_0 -// #define AMP3_CS_PIN GPIO_PIN_0 -void led_init(GEN_led_t *hled, GPIO_TypeDef *port, uint16_t pin) -{ - hled->port = port; - hled->pin = pin; - - HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); -} - -void led_on(GEN_led_t *hled) -{ - HAL_GPIO_WritePin(hled->port, hled->pin, GPIO_PIN_RESET); -} - -void led_off(GEN_led_t *hled) -{ - HAL_GPIO_WritePin(hled->port, hled->pin, GPIO_PIN_SET); -} - -void gen_init() -{ - ad9833_init(&dds_gen[FG_CHAN1].hdds, &hspi2, DDS1_CS_GPIO_Port, DDS1_CS_Pin); - ad9833_init(&dds_gen[FG_CHAN2].hdds, &hspi2, DDS2_CS_GPIO_Port, DDS2_CS_Pin); - // ad9833_init(&dds_gen[FG_CHAN3].hdds, &hspi2, DDS3_CS_PORT, DDS3_CS_PIN); - - // ltc2631_init(&dds_gen[FG_CHAN1].hoffs, &hi2c1, 0x00, LTC2631_8BIT, LTC_REF_2V5); - // ltc2631_init(&dds_gen[FG_CHAN2].hoffs, &hi2c1, 0x01, LTC2631_8BIT, LTC_REF_2V5); - // ltc2631_init(&dds_gen[FG_CHAN3].hoffs, &hi2c1, 0x02, LTC2631_8BIT, LTC_REF_2V5); - - mcp41x_init(&dds_gen[FG_CHAN1].hampl, &hspi2, AMP1_CS_GPIO_Port, AMP1_CS_Pin, MCP41X_10K); - mcp41x_init(&dds_gen[FG_CHAN2].hampl, &hspi2, AMP2_CS_GPIO_Port, AMP2_CS_Pin, MCP41X_10K); - // mcp41x_init(&dds_gen[FG_CHAN3].hampl, &hspi2, AMP3_CS_PORT, AMP3_CS_PIN, MCP41X_10K); - - led_init(&dds_gen[FG_CHAN1].hled, LED_CH1_GPIO_Port, LED_CH1_Pin); - led_init(&dds_gen[FG_CHAN2].hled, LED_CH2_GPIO_Port, LED_CH2_Pin); -} - -static void _setAmpliude(mcp41x_handle_t *hampl, uint16_t ampl_x100) -{ - uint8_t value = (ampl_x100 * UINT8_MAX) / MAX_VOLT_POS; - ULOG_DEBUG("(%d:_setAmplitude) ampl_x100: %d, value: %d", __LINE__, ampl_x100, value); - mcp41x_setValue(hampl, value); -} - -static void _setOffset(ltc2631_handle_t *hoffs, int16_t offs_x100) -{ - uint32_t value = (offs_x100 + MAX_VOLT_POS) * LTC_REF_2V5; - ULOG_DEBUG("(%d:_setOffset) offs_x100: %d, value: %d", __LINE__, offs_x100, value); - ltc2631_setOutputVoltage_u(hoffs, value); -} - -static void _setFreqDdsGen(ad9833_handle_t *hdds, uint32_t freq) -{ - ULOG_DEBUG("(%d:_setFreqDdsGen) freq: %d", __LINE__, freq); - ad9833_setFrequency(hdds, CHAN_0, freq); -} - -static void _setPhaseDdsGen(ad9833_handle_t *hdds, uint32_t phas) -{ - ULOG_DEBUG("(%d:_setPhaseDdsGen) phase: %d", __LINE__, phas); - ad9833_setPhase(hdds, CHAN_0, phas); -} - -static void _setWaveDdsGen(ad9833_handle_t *hdds, GEN_wave_t wave) -{ - ULOG_DEBUG("(%d:_setWaveDdsGen) wave: %d", __LINE__, wave); - switch (wave) - { - case GEN_SIN: - ad9833_setMode(hdds, MODE_SINE); - break; - case GEN_TRI: - ad9833_setMode(hdds, MODE_TRIANGLE); - break; - case GEN_SQR: - ad9833_setMode(hdds, MODE_SQUARE1); - break; - - default: - ULOG_ERROR("%s:%d: Unknown wave type: %d", __FILE__, __LINE__, wave); - break; - } -} - -static void _setEnabledDdsGen(FG_handle_t *hfg, GEN_fg_t *gen) -{ - ULOG_DEBUG("(%d:_setEnabledDdsGen) enabled: %d", __LINE__, gen->enabled); - switch (gen->enabled) - { - case FALSE: - ad9833_setMode(&hfg->hdds, MODE_OFF); - led_off(&hfg->hled); - break; - case TRUE: - _setWaveDdsGen(&hfg->hdds, gen->wave); - led_on(&hfg->hled); - break; - - default: - ULOG_ERROR("%s:%d: Value out of range: %d", __FILE__, __LINE__, gen->enabled); - break; - } -} - -static void _setFreqPwmGen(timer_handle_t *hpwm, uint32_t freq) -{ -} - -static void _setPhasePwmGen(timer_handle_t *hpwm, uint16_t phas) -{ -} - -static void _setDutyPwmGen(timer_handle_t *hpwm, uint8_t duty) -{ -} - -static void _setEnabledPwmGen(PWM_handle_t *hpwm, bool_t en) -{ -} - -void setFreq(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_FG_TYPE: - _setFreqDdsGen(&dds_gen[ch_to_gen_ch[channel]].hdds, ((GEN_fg_t *)gen->gen)->frequency); - break; - case GEN_PWM_TYPE: - _setFreqPwmGen(&pwm_gen[ch_to_gen_ch[channel]].hpwm, ((GEN_pwm_t *)gen->gen)->frequency); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setAmplitude(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_FG_TYPE: - _setAmpliude(&dds_gen[ch_to_gen_ch[channel]].hampl, ((GEN_fg_t *)gen->gen)->amplitude); - break; - case GEN_PWM_TYPE: - _setAmpliude(&pwm_gen[ch_to_gen_ch[channel]].hampl, ((GEN_pwm_t *)gen->gen)->amplitude); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setOfsset(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_FG_TYPE: - _setOffset(&dds_gen[ch_to_gen_ch[channel]].hoffs, ((GEN_fg_t *)gen->gen)->offset); - break; - case GEN_PWM_TYPE: - _setOffset(&pwm_gen[ch_to_gen_ch[channel]].hoffs, ((GEN_pwm_t *)gen->gen)->offset); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setPhase(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_FG_TYPE: - _setPhaseDdsGen(&dds_gen[ch_to_gen_ch[channel]].hdds, ((GEN_fg_t *)gen->gen)->phase); - break; - case GEN_PWM_TYPE: - _setPhasePwmGen(&pwm_gen[ch_to_gen_ch[channel]].hpwm, ((GEN_pwm_t *)gen->gen)->phase); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setWave(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_FG_TYPE: - _setWaveDdsGen(&dds_gen[ch_to_gen_ch[channel]].hdds, ((GEN_fg_t *)gen->gen)->wave); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setDuty(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_PWM_TYPE: - _setDutyPwmGen(&pwm_gen[ch_to_gen_ch[channel]].hpwm, ((GEN_pwm_t *)gen->gen)->duty); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setEnabled(GEN_sig_t *gen, GEN_channel_t channel) -{ - switch (gen->type) - { - case GEN_FG_TYPE: - _setEnabledDdsGen(&dds_gen[ch_to_gen_ch[channel]], ((GEN_fg_t *)gen->gen)); - break; - case GEN_PWM_TYPE: - _setEnabledPwmGen(&pwm_gen[ch_to_gen_ch[channel]], ((GEN_pwm_t *)gen->gen)->enabled); - break; - - default: - ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, gen->type); - break; - } -} - -void setLink(GEN_sig_t *source_gen, GEN_channel_t source_ch, GEN_sig_t *dest_gen, GEN_channel_t dest_ch) -{ -} \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_generator.h b/firmware/shared_libs/controllers/ctrl_generator.h deleted file mode 100644 index beab7d9..0000000 --- a/firmware/shared_libs/controllers/ctrl_generator.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "ctrl_app.h" - -void setLink(GEN_sig_t *source_gen, GEN_channel_t source_ch, GEN_sig_t *dest_gen, GEN_channel_t dest_ch); -void setEnabled(GEN_sig_t *gen, GEN_channel_t channel); -void setDuty(GEN_sig_t *gen, GEN_channel_t channel); -void setWave(GEN_sig_t *gen, GEN_channel_t channel); -void setPhase(GEN_sig_t *gen, GEN_channel_t channel); -void setOfsset(GEN_sig_t *gen, GEN_channel_t channel); -void setAmplitude(GEN_sig_t *gen, GEN_channel_t channel); -void setFreq(GEN_sig_t *gen, GEN_channel_t channel); -void gen_init(); \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_signal_gen.c b/firmware/shared_libs/controllers/ctrl_signal_gen.c new file mode 100644 index 0000000..0d64c5d --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_signal_gen.c @@ -0,0 +1,478 @@ +#include "spi.h" +#include "ctrl_app_types.h" +#include "mcu_cs.h" +#include "led.h" + +static MCU_cs_t mcu_cs[MCU_CS_MAX]; + +// ************************ +// INITIALIZATION +// ************************ + +static void _dds_init(dds_gen_t *dds_gen) +{ + dds_gen->link.next = &dds_gen->super; + dds_gen->link.prev = &dds_gen->super; + + switch (dds_gen->dds_ch) + { + case DDS_CH1: + mcu_cs_init(&mcu_cs[MCU_CS1], DDS1_CS_GPIO_Port, DDS1_CS_Pin, GPIO_PIN_SET); + ad9833_init(&dds_gen->handle.hdds, &hspi2, &mcu_cs[MCU_CS1].super); + + mcu_cs_init(&mcu_cs[MCU_CS2], AMP1_CS_GPIO_Port, AMP1_CS_Pin, GPIO_PIN_SET); + mcp41x_init(&dds_gen->handle.hampl, &hspi2, &mcu_cs[MCU_CS2].super, MCP41X_10K); + + led_init(&dds_gen->handle.hled, LED_CH1_GPIO_Port, LED_CH1_Pin); + break; + case DDS_CH2: + mcu_cs_init(&mcu_cs[MCU_CS3], DDS2_CS_GPIO_Port, DDS2_CS_Pin, GPIO_PIN_SET); + ad9833_init(&dds_gen->handle.hdds, &hspi2, &mcu_cs[MCU_CS3].super); + + mcu_cs_init(&mcu_cs[MCU_CS4], AMP2_CS_GPIO_Port, AMP2_CS_Pin, GPIO_PIN_SET); + mcp41x_init(&dds_gen->handle.hampl, &hspi2, &mcu_cs[MCU_CS4].super, MCP41X_10K); + + led_init(&dds_gen->handle.hled, LED_CH2_GPIO_Port, LED_CH2_Pin); + break; + case DDS_CH3: + + break; + + default: + break; + } +} + +static void _pwm_init(pwm_gen_t *pwm_gen) +{ + switch (pwm_gen->pwm_ch) + { + case PWM_CH1: + + break; + case PWM_CH2: + + break; + case PWM_CH3: + + break; + + default: + break; + } +} + +void GEN_init(signal_gen_t **signal_gen) +{ + for (GEN_channel_t channel = CHANNEL1; channel < CHANNEL_MAX; channel++) + { + switch (signal_gen[channel]->type) + { + case GEN_FG_TYPE: + _dds_init((dds_gen_t *)signal_gen[channel]); + case GEN_PWM_TYPE: + _pwm_init((pwm_gen_t *)signal_gen[channel]); + default: + break; + } + } + + // ad9833_init(&dds_gen[FG_CHAN3].hdds, &hspi2, DDS3_CS_PORT, DDS3_CS_PIN); + + // ltc2631_init(&dds_gen[FG_CHAN1].hoffs, &hi2c1, 0x00, LTC2631_8BIT, LTC_REF_2V5); + // ltc2631_init(&dds_gen[FG_CHAN2].hoffs, &hi2c1, 0x01, LTC2631_8BIT, LTC_REF_2V5); + // ltc2631_init(&dds_gen[FG_CHAN3].hoffs, &hi2c1, 0x02, LTC2631_8BIT, LTC_REF_2V5); + + // mcp41x_init(&dds_gen[FG_CHAN3].hampl, &hspi2, AMP3_CS_PORT, AMP3_CS_PIN, MCP41X_10K); +} + +// ************************ +// AMPLITIUDE +// ************************ + +static void _setAmpliude(mcp41x_handle_t *hampl, uint16_t ampl_x100) +{ + uint8_t value = (ampl_x100 * UINT8_MAX) / MAX_VOLT_POS; + ULOG_DEBUG("(%d:_setAmplitude) ampl_x100: %d, value: %d", __LINE__, ampl_x100, value); + + mcp41x_setValue(hampl, value); +} + +void setAmplitude(signal_gen_t *sig_gen) +{ + static signal_gen_t *curr_sig_gen = NULL; + + if (curr_sig_gen == NULL) + { + curr_sig_gen = sig_gen; + } + + switch (sig_gen->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = dds_gen->link.next; + + _setAmpliude(&dds_gen->handle.hampl, dds_gen->settings.amplitude); + + if (next_sig_gen != curr_sig_gen) + { + setAmplitude(next_sig_gen); + } + else + { + curr_sig_gen = NULL; + } + + break; + } + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = pwm_gen->link.next; + + _setAmpliude(&pwm_gen->handle.hampl, pwm_gen->settings.amplitude); + + if (next_sig_gen != curr_sig_gen) + { + setAmplitude(next_sig_gen); + } + else + { + curr_sig_gen = NULL; + } + + break; + } + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// OFFSET +// ************************ + +static void _setOffset(ltc2631_handle_t *hoffs, int16_t offs_x100) +{ + uint32_t value = (offs_x100 + MAX_VOLT_POS) * LTC_REF_2V5; + ULOG_DEBUG("(%d:_setOffset) offs_x100: %d, value: %d", __LINE__, offs_x100, value); + ltc2631_setOutputVoltage_u(hoffs, value); +} + +void setOfsset(signal_gen_t *sig_gen) +{ + static signal_gen_t *curr_sig_gen = NULL; + + if (curr_sig_gen == NULL) + { + curr_sig_gen = sig_gen; + } + + switch (sig_gen->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = dds_gen->link.next; + + _setOffset(&dds_gen->handle.hoffs, dds_gen->settings.offset); + + if (next_sig_gen != curr_sig_gen) + { + setOfsset(next_sig_gen); + } + else + { + curr_sig_gen = NULL; + } + break; + } + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = pwm_gen->link.next; + + _setOffset(&pwm_gen->handle.hoffs, pwm_gen->settings.offset); + + if (next_sig_gen != curr_sig_gen) + { + setOfsset(next_sig_gen); + } + else + { + curr_sig_gen = NULL; + } + break; + } + + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// FREQUENCY +// ************************ + +static void _setFreqDdsGen(ad9833_handle_t *hdds, uint32_t freq) +{ + ULOG_DEBUG("(%d:_setFreqDdsGen) freq: %d", __LINE__, freq); + ad9833_setFrequency(hdds, CHAN_0, freq); +} + +static void _setFreqPwmGen(timer_handle_t *hpwm, uint32_t freq) +{ +} + +void setFrequency(signal_gen_t *sig_gen) +{ + static signal_gen_t *curr_sig_gen = NULL; + + if (curr_sig_gen == NULL) + { + curr_sig_gen = sig_gen; + } + + switch (sig_gen->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = dds_gen->link.next; + + ad9833_spi_activate(&dds_gen->handle.hdds); + + if (next_sig_gen != curr_sig_gen) + { + setFrequency(next_sig_gen); + } + else + { + _setFreqDdsGen(&dds_gen->handle.hdds, dds_gen->settings.frequency); + curr_sig_gen = NULL; + } + + ad9833_spi_deactivate(&dds_gen->handle.hdds); + break; + } + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = pwm_gen->link.next; + + _setFreqPwmGen(&pwm_gen->handle.hpwm, pwm_gen->settings.frequency); + + if (next_sig_gen != curr_sig_gen) + { + setFrequency(next_sig_gen); + } + else + { + curr_sig_gen = NULL; + } + break; + } + + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// PHASE +// ************************ + +static void _setPhaseDdsGen(ad9833_handle_t *hdds, uint32_t phas) +{ + ULOG_DEBUG("(%d:_setPhaseDdsGen) phase: %d", __LINE__, phas); + ad9833_setPhase(hdds, CHAN_0, phas); +} + +static void _setPhasePwmGen(timer_handle_t *hpwm, uint16_t phas) +{ +} + +void setPhase(signal_gen_t *sig_gen) +{ + static signal_gen_t *curr_sig_gen = NULL; + + if (curr_sig_gen == NULL) + { + curr_sig_gen = sig_gen; + } + + switch (sig_gen->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = dds_gen->link.next; + + ad9833_spi_activate(&dds_gen->handle.hdds); + + if (next_sig_gen != curr_sig_gen) + { + setPhase(next_sig_gen); + } + else + { + _setPhaseDdsGen(&dds_gen->handle.hdds, dds_gen->settings.phase); + curr_sig_gen = NULL; + } + + ad9833_spi_deactivate(&dds_gen->handle.hdds); + break; + } + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)sig_gen; + signal_gen_t *next_sig_gen = pwm_gen->link.next; + + _setPhasePwmGen(&pwm_gen->handle.hpwm, pwm_gen->settings.phase); + + if (next_sig_gen != curr_sig_gen) + { + setPhase(next_sig_gen); + } + else + { + curr_sig_gen = NULL; + } + break; + } + + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// DUTY +// ************************ + +static void _setDutyPwmGen(timer_handle_t *hpwm, uint8_t duty) +{ +} + +void setDuty(signal_gen_t *sig_gen) +{ + switch (sig_gen->type) + { + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)sig_gen; + _setDutyPwmGen(&pwm_gen->handle.hpwm, pwm_gen->settings.duty); + break; + } + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// WAVE +// ************************ + +static void _setWaveDdsGen(ad9833_handle_t *hdds, GEN_wave_t wave) +{ + ULOG_DEBUG("(%d:_setWaveDdsGen) wave: %d", __LINE__, wave); + switch (wave) + { + case GEN_SIN: + ad9833_setMode(hdds, MODE_SINE); + break; + case GEN_TRI: + ad9833_setMode(hdds, MODE_TRIANGLE); + break; + case GEN_SQR: + ad9833_setMode(hdds, MODE_SQUARE1); + break; + + default: + ULOG_ERROR("%s:%d: Unknown wave type: %d", __FILE__, __LINE__, wave); + break; + } +} + +void setWave(signal_gen_t *sig_gen) +{ + switch (sig_gen->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)sig_gen; + _setWaveDdsGen(&dds_gen->handle.hdds, dds_gen->settings.wave); + break; + } + + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// ENABLE +// ************************ + +static void _setEnabledDdsGen(dds_handle_t *hfg, dds_settings_t *settings) +{ + ULOG_DEBUG("(%d:_setEnabledDdsGen) enabled: %d", __LINE__, settings->enabled); + switch (settings->enabled) + { + case FALSE: + ad9833_setMode(&hfg->hdds, MODE_OFF); + led_off(&hfg->hled); + break; + case TRUE: + _setWaveDdsGen(&hfg->hdds, settings->wave); + led_on(&hfg->hled); + break; + + default: + ULOG_ERROR("%s:%d: Value out of range: %d", __FILE__, __LINE__, settings->enabled); + break; + } +} + +static void _setEnabledPwmGen(timer_handle_t *hpwm, bool_t en) +{ +} + +void setEnabled(signal_gen_t *sig_gen) +{ + switch (sig_gen->type) + { + case GEN_FG_TYPE: + { + dds_gen_t *dds_gen = (dds_gen_t *)sig_gen; + _setEnabledDdsGen(&dds_gen->handle, &dds_gen->settings); + break; + } + case GEN_PWM_TYPE: + { + pwm_gen_t *pwm_gen = (pwm_gen_t *)sig_gen; + _setEnabledPwmGen(&pwm_gen->handle.hpwm, pwm_gen->settings.enabled); + break; + } + + default: + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, sig_gen->type); + break; + } +} + +// ************************ +// LINK +// ************************ + +void setLink(signal_gen_t *source_gen, signal_gen_t *dest_gen) +{ +} diff --git a/firmware/shared_libs/controllers/ctrl_signal_gen.h b/firmware/shared_libs/controllers/ctrl_signal_gen.h new file mode 100644 index 0000000..158e6fe --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_signal_gen.h @@ -0,0 +1,12 @@ +#pragma once +#include "ctrl_app_types.h" + +void setLink(signal_gen_t *source_gen, signal_gen_t *dest_gen); +void setEnabled(signal_gen_t *gen); +void setDuty(signal_gen_t *gen); +void setWave(signal_gen_t *gen); +void setPhase(signal_gen_t *gen); +void setOfsset(signal_gen_t *gen); +void setAmplitude(signal_gen_t *gen); +void setFrequency(signal_gen_t *gen); +void GEN_init(signal_gen_t **signal_gen); \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index dd0dff2..9582677 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -74,7 +74,7 @@ static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data) BITMAP_buttonName_t bitmap_idx; for (LAY_dispBtn_t btn_idx = DISP_BTN_1; btn_idx < DISP_BTN_MAX; btn_idx++) { - if (!(app_data->isButtonBlink & (1 << btn_idx))) + if (!(app_data->button_blink & (1 << btn_idx))) { continue; } @@ -88,7 +88,7 @@ static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data) else { DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx], btn_pos_x[btn_idx], 53, BM_NORMAL); - app_data->isButtonBlink &= ~(1 << btn_idx); + app_data->button_blink &= ~(1 << btn_idx); } } } @@ -105,7 +105,7 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx], btn_pos_x[btn_idx], 53, BM_NORMAL); } - app_data->isButtonChange = 0; + app_data->disp_update &= ~(UPDATE_BUTTON); } static uint8_t _calcMarkerPos(uint32_t value, uint32_t max) @@ -180,24 +180,24 @@ static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t f static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { - GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->curr_gen; + dds_gen_t *fun_gen = (dds_gen_t *)app_data->curr_gen; switch (app_data->curr_state_lay) { case LAY_FREQ: - _drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit); - _drawMeterHelper(disp, "1", "1M", _calcMarkerPos(fun_gen->frequency, MAX_FREQ)); + _drawFreqValueHelper(disp, fun_gen->settings.frequency, app_data->freq_focus_digit); + _drawMeterHelper(disp, "1", "1M", _calcMarkerPos(fun_gen->settings.frequency, MAX_FREQ)); break; case LAY_AMPL: - _drawAmplValueHelper(disp, fun_gen->amplitude, app_data->ampl_focus_digit); - _drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(fun_gen->amplitude, MAX_VOLT_POS)); + _drawAmplValueHelper(disp, fun_gen->settings.amplitude, app_data->ampl_focus_digit); + _drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(fun_gen->settings.amplitude, MAX_VOLT_POS)); break; case LAY_OFFS: - _drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit); - _drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(MAX_VOLT_POS + fun_gen->offset, MAX_VOLT_POS * 2)); + _drawOffsValueHelper(disp, fun_gen->settings.offset, app_data->offs_focus_digit); + _drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(MAX_VOLT_POS + fun_gen->settings.offset, MAX_VOLT_POS * 2)); break; case LAY_PHAS: - _drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit); - _drawMeterHelper(disp, "0", "360", _calcMarkerPos(fun_gen->phase, MAX_PHAS)); + _drawPhaseValueHelper(disp, fun_gen->settings.phase, app_data->phas_focus_digit); + _drawMeterHelper(disp, "0", "360", _calcMarkerPos(fun_gen->settings.phase, MAX_PHAS)); break; case LAY_MAIN: DISP_clearRegion(disp, 62, 13, 66, 40); @@ -206,10 +206,10 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 33, BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL); - _drawFreqValue(disp, fun_gen->frequency, 13); - _drawAmplValue(disp, fun_gen->amplitude, 23); - _drawOffsValue(disp, fun_gen->offset, 33); - _drawPhasValue(disp, fun_gen->phase, 43); + _drawFreqValue(disp, fun_gen->settings.frequency, 13); + _drawAmplValue(disp, fun_gen->settings.amplitude, 23); + _drawOffsValue(disp, fun_gen->settings.offset, 33); + _drawPhasValue(disp, fun_gen->settings.phase, 43); break; default: @@ -226,7 +226,7 @@ static void _drawPwmGenValues(GFX_display_t *disp, APP_data_t *app_data) static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) { // input: frequency(value), amplitiude(value), offset(value), phase(value), duty(value), invert(info), position(value) - switch (app_data->curr_gen_type) + switch (app_data->curr_gen->type) { case GEN_FG_TYPE: _drawFuncGenValues(disp, app_data); @@ -239,7 +239,7 @@ static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) break; } - app_data->isValueChange = 0; + app_data->disp_update &= ~(UPDATE_VALUE); } static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) @@ -264,26 +264,26 @@ static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) static void _drawFunGenGraph(GFX_display_t *disp, APP_data_t *app_data) { - GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->curr_gen; + dds_gen_t *fun_gen = (dds_gen_t *)app_data->curr_gen; DISP_clearRegion(disp, 3, 12, 57, 40); - switch (fun_gen->wave) + switch (fun_gen->settings.wave) { case GEN_SIN: - DISP_drawBitmapShift(disp, &wave[WAVE_SIN], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL); + DISP_drawBitmapShift(disp, &wave[WAVE_SIN], 6, 19, _calcPhaseShiftInPxl(fun_gen->settings.phase, 360), BM_NORMAL); break; case GEN_TRI: - DISP_drawBitmapShift(disp, &wave[WAVE_TRI], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL); + DISP_drawBitmapShift(disp, &wave[WAVE_TRI], 6, 19, _calcPhaseShiftInPxl(fun_gen->settings.phase, 360), BM_NORMAL); break; case GEN_SQR: - DISP_drawBitmapShift(disp, &wave[WAVE_SQR], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL); + DISP_drawBitmapShift(disp, &wave[WAVE_SQR], 6, 19, _calcPhaseShiftInPxl(fun_gen->settings.phase, 360), BM_NORMAL); break; default: break; } - _drawOffsetLine(disp, fun_gen->offset, fun_gen->amplitude); - // _drawMaxAmpLine(disp, fun_gen->offset, fun_gen->amplitude); + _drawOffsetLine(disp, fun_gen->settings.offset, fun_gen->settings.amplitude); + // _drawMaxAmpLine(disp, fun_gen->settings.offset, fun_gen->settings.amplitude); } static void _drawPwmGenGraph(GFX_display_t *disp, APP_data_t *app_data) { @@ -294,7 +294,7 @@ static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data) // input: graph type(sin, triangle, squere, pwm), frequency(info), amplitiude(value), offset(value), phase(value), invert(pwm), DISP_drawVerticalLine(disp, 2, 12, 40, GFX_WHITE); - switch (app_data->curr_gen_type) + switch (app_data->curr_gen->type) { case GEN_FG_TYPE: _drawFunGenGraph(disp, app_data); @@ -307,7 +307,7 @@ static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data) break; } - app_data->isGraphChange = 0; + app_data->disp_update &= ~(UPDATE_GRAPH); } static void _drawChannels(GFX_display_t *disp, APP_data_t *app_data) @@ -321,23 +321,23 @@ static void _drawChannels(GFX_display_t *disp, APP_data_t *app_data) DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH6", 107, 2, CHANNEL6 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); DISP_drawHorizontalLine(disp, 0, 10, 127, GFX_WHITE); - app_data->isChannelChange = 0; + app_data->disp_update &= ~(UPDATE_CHANNEL); } void LAY_drawDisplayLayout(GFX_display_t *disp, APP_data_t *app_data) { - if (app_data->isChannelChange) + if (app_data->disp_update & UPDATE_CHANNEL) _drawChannels(disp, app_data); - if (app_data->isValueChange) + if (app_data->disp_update & UPDATE_VALUE) _drawValues(disp, app_data); - if (app_data->isGraphChange) + if (app_data->disp_update & UPDATE_GRAPH) _drawGraph(disp, app_data); - if (app_data->isButtonChange) + if (app_data->disp_update & UPDATE_BUTTON) _drawButtons(disp, app_data); - if (app_data->isButtonBlink) + if (app_data->button_blink) _blinkButtons(disp, app_data); } diff --git a/firmware/shared_libs/drivers/ad9833/ad9833.c b/firmware/shared_libs/drivers/ad9833/ad9833.c index 8980410..fd92b80 100644 --- a/firmware/shared_libs/drivers/ad9833/ad9833.c +++ b/firmware/shared_libs/drivers/ad9833/ad9833.c @@ -9,12 +9,14 @@ void ad9833_spi_activate(ad9833_handle_t *hfg) { - HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_RESET); + // HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_RESET); + hfg->hcs->cs_on(hfg->hcs); } void ad9833_spi_deactivate(ad9833_handle_t *hfg) { - HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_SET); + // HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_SET); + hfg->hcs->cs_off(hfg->hcs); } static void ad9833_transmit16(ad9833_handle_t *hfg, uint16_t data) @@ -41,16 +43,15 @@ void ad9833_reset(ad9833_handle_t *hfg, uint8_t hold) } } -void ad9833_init(ad9833_handle_t *hfg, SPI_HandleTypeDef *hspi, GPIO_TypeDef *cs_port, uint16_t cs_pin) +void ad9833_init(ad9833_handle_t *hfg, SPI_HandleTypeDef *hspi, cs_handle_t *hcs) // Initialise the AD9833 and then set up safe values for the AD9833 device // Procedure from Figure 27 of in the AD9833 Data Sheet { // initialise our preferred CS pin (could be same as SS) hfg->hspi = hspi; - hfg->cs_port = cs_port; - hfg->cs_pin = cs_pin; + hfg->hcs = hcs; - HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_SET); + hfg->hcs->cs_off(hfg->hcs); hfg->_regCtl = 0; hfg->_regCtl |= (1 << AD_B28); // always write 2 words consecutively for frequency @@ -181,8 +182,6 @@ void ad9833_setFrequency(ad9833_handle_t *hfg, AD_channel_t chan, uint32_t freq) // PRINT("\nsetFreq CHAN_", chan); uint16_t freq_channel = 0; - hfg->_freq[chan] = freq; - hfg->_regFreq[chan] = ad9833_calcFreq_uint(freq); // select the address mask @@ -215,7 +214,6 @@ void ad9833_setPhase(ad9833_handle_t *hfg, AD_channel_t chan, uint16_t phase) // PRINT("\nsetPhase CHAN_", chan); uint16_t phase_channel = 0; - hfg->_phase[chan] = phase; hfg->_regPhase[chan] = ad9833_calcPhase_uint(phase); // select the address mask diff --git a/firmware/shared_libs/drivers/ad9833/ad9833.h b/firmware/shared_libs/drivers/ad9833/ad9833.h index b0a0382..a5a98e3 100644 --- a/firmware/shared_libs/drivers/ad9833/ad9833.h +++ b/firmware/shared_libs/drivers/ad9833/ad9833.h @@ -1,5 +1,7 @@ #pragma once +#include "spi_cs_if.h" + #define AD_DEFAULT_FREQ 1000U ///< Default initialisation frequency (Hz) #define AD_DEFAULT_PHASE 0 ///< Default initialisation phase angle (degrees) #define AD_MCLK 25000000U ///< Clock speed of the AD9833 reference clock in Hz @@ -37,16 +39,13 @@ typedef struct uint32_t _regFreq[2]; // frequency registers uint32_t _regPhase[2]; // phase registers - AD_mode_t _mode; // last set mode - float _freq[2]; // last frequencies set - uint16_t _phase[2]; // last phase setting + AD_mode_t _mode; // last set mode SPI_HandleTypeDef *hspi; - GPIO_TypeDef *cs_port; - uint16_t cs_pin; + cs_handle_t *hcs; } ad9833_handle_t; -void ad9833_init(ad9833_handle_t *hfg, SPI_HandleTypeDef *hspi, GPIO_TypeDef *cs_port, uint16_t cs_pin); +void ad9833_init(ad9833_handle_t *hfg, SPI_HandleTypeDef *hspi, cs_handle_t *hcs); void ad9833_spi_activate(ad9833_handle_t *hfg); void ad9833_spi_deactivate(ad9833_handle_t *hfg); void ad9833_reset(ad9833_handle_t *hfg, uint8_t hold); diff --git a/firmware/shared_libs/drivers/led/led.c b/firmware/shared_libs/drivers/led/led.c new file mode 100644 index 0000000..98b597f --- /dev/null +++ b/firmware/shared_libs/drivers/led/led.c @@ -0,0 +1,19 @@ +#include "led.h" + +void led_init(led_handle_t *hled, GPIO_TypeDef *port, uint16_t pin) +{ + hled->port = port; + hled->pin = pin; + + HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); +} + +void led_on(led_handle_t *hled) +{ + HAL_GPIO_WritePin(hled->port, hled->pin, GPIO_PIN_RESET); +} + +void led_off(led_handle_t *hled) +{ + HAL_GPIO_WritePin(hled->port, hled->pin, GPIO_PIN_SET); +} \ No newline at end of file diff --git a/firmware/shared_libs/drivers/led/led.h b/firmware/shared_libs/drivers/led/led.h new file mode 100644 index 0000000..3d70aa1 --- /dev/null +++ b/firmware/shared_libs/drivers/led/led.h @@ -0,0 +1,8 @@ +#pragma once + +#include "gpio.h" +#include "ctrl_app_types.h" + +void led_init(led_handle_t *hled, GPIO_TypeDef *port, uint16_t pin); +void led_on(led_handle_t *hled); +void led_off(led_handle_t *hled); \ No newline at end of file diff --git a/firmware/shared_libs/drivers/mcp41x/mcp41x.c b/firmware/shared_libs/drivers/mcp41x/mcp41x.c index 35cc9f0..21fe593 100644 --- a/firmware/shared_libs/drivers/mcp41x/mcp41x.c +++ b/firmware/shared_libs/drivers/mcp41x/mcp41x.c @@ -5,20 +5,19 @@ static uint32_t pot_value[MCP41X_RES_MAX] = {10000, 50000, 100000}; static void mcp41x_transmit(mcp41x_handle_t *hpot, uint8_t *data) { - HAL_GPIO_WritePin(hpot->cs_port, hpot->cs_pin, GPIO_PIN_RESET); + hpot->hcs->cs_on(hpot->hcs); HAL_SPI_Transmit(hpot->hspi, data, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(hpot->cs_port, hpot->cs_pin, GPIO_PIN_SET); + hpot->hcs->cs_off(hpot->hcs); } -void mcp41x_init(mcp41x_handle_t *hpot, SPI_HandleTypeDef *hspi, GPIO_TypeDef *cs_port, uint16_t cs_pin, mcp41x_res_t res) +void mcp41x_init(mcp41x_handle_t *hpot, SPI_HandleTypeDef *hspi, cs_handle_t *hcs, mcp41x_res_t res) { hpot->hspi = hspi; - hpot->cs_port = cs_port; - hpot->cs_pin = cs_pin; + hpot->hcs = hcs; hpot->max_res = res; hpot->dir = MCP41X_ATOB; - HAL_GPIO_WritePin(hpot->cs_port, hpot->cs_pin, GPIO_PIN_SET); + hpot->hcs->cs_off(hcs); } void mcp41x_setValue(mcp41x_handle_t *hpot, uint8_t value) diff --git a/firmware/shared_libs/drivers/mcp41x/mcp41x.h b/firmware/shared_libs/drivers/mcp41x/mcp41x.h index 7a53452..b2dd0f9 100644 --- a/firmware/shared_libs/drivers/mcp41x/mcp41x.h +++ b/firmware/shared_libs/drivers/mcp41x/mcp41x.h @@ -1,5 +1,7 @@ #pragma once +#include "spi_cs_if.h" + #define MCP41X_C1 5 #define MCP41X_C0 4 #define MCP41X_P1 1 @@ -36,11 +38,10 @@ typedef struct uint8_t value; SPI_HandleTypeDef *hspi; - GPIO_TypeDef *cs_port; - uint16_t cs_pin; + cs_handle_t *hcs; } mcp41x_handle_t; -void mcp41x_init(mcp41x_handle_t *hpot, SPI_HandleTypeDef *hspi, GPIO_TypeDef *cs_port, uint16_t cs_pin, mcp41x_res_t res); +void mcp41x_init(mcp41x_handle_t *hpot, SPI_HandleTypeDef *hspi, cs_handle_t *hcs, mcp41x_res_t res); void mcp41x_setValue(mcp41x_handle_t *hpot, uint8_t value); void mcp41x_setVolume(mcp41x_handle_t *hpot, uint8_t volume); uint8_t mcp41x_getVolume(mcp41x_handle_t *hpot); diff --git a/firmware/shared_libs/drivers/mcu_cs/mcu_cs.c b/firmware/shared_libs/drivers/mcu_cs/mcu_cs.c new file mode 100644 index 0000000..19fb05c --- /dev/null +++ b/firmware/shared_libs/drivers/mcu_cs/mcu_cs.c @@ -0,0 +1,24 @@ +#include "mcu_cs.h" + +// static cs_handle_t const _cs_handle = {.cs_on = mcu_cs_on, .cs_off = mcu_cs_off}; + +void mcu_cs_init(MCU_cs_t *hcs, GPIO_TypeDef *cs_port, uint16_t cs_pin, uint8_t cs_idle) +{ + hcs->super.cs_on = mcu_cs_on; + hcs->super.cs_off = mcu_cs_off; + hcs->cs_port = cs_port; + hcs->cs_pin = cs_pin; + hcs->cs_idle = cs_idle; +} + +void mcu_cs_on(cs_handle_t *hcs) +{ + MCU_cs_t *_hcs = (MCU_cs_t *)hcs; + HAL_GPIO_WritePin(_hcs->cs_port, _hcs->cs_pin, !_hcs->cs_idle); +} + +void mcu_cs_off(cs_handle_t *hcs) +{ + MCU_cs_t *_hcs = (MCU_cs_t *)hcs; + HAL_GPIO_WritePin(_hcs->cs_port, _hcs->cs_pin, _hcs->cs_idle); +} \ No newline at end of file diff --git a/firmware/shared_libs/drivers/mcu_cs/mcu_cs.h b/firmware/shared_libs/drivers/mcu_cs/mcu_cs.h new file mode 100644 index 0000000..6ab9309 --- /dev/null +++ b/firmware/shared_libs/drivers/mcu_cs/mcu_cs.h @@ -0,0 +1,16 @@ +#pragma once + +#include "main.h" +#include "spi_cs_if.h" + +typedef struct +{ + cs_handle_t super; + GPIO_TypeDef *cs_port; + uint16_t cs_pin; + uint8_t cs_idle; +} MCU_cs_t; + +void mcu_cs_init(MCU_cs_t *hcs, GPIO_TypeDef *cs_port, uint16_t cs_pin, uint8_t cs_idle); +void mcu_cs_on(cs_handle_t *me); +void mcu_cs_off(cs_handle_t *me); \ No newline at end of file diff --git a/firmware/shared_libs/utils/spi_cs/spi_cs_if.h b/firmware/shared_libs/utils/spi_cs/spi_cs_if.h new file mode 100644 index 0000000..abf7ff0 --- /dev/null +++ b/firmware/shared_libs/utils/spi_cs/spi_cs_if.h @@ -0,0 +1,14 @@ +#pragma once + +#include "stdint.h" + +typedef struct cs_handle_t cs_handle_t; + +typedef void (*cs_on_t)(cs_handle_t *hcs); +typedef void (*cs_off_t)(cs_handle_t *hcs); + +struct cs_handle_t +{ + cs_on_t cs_on; + cs_off_t cs_off; +};