Compare commits

...

4 Commits

Author SHA1 Message Date
3e7c5c5089 [refactor] prepare for link gen 2023-08-15 16:18:48 +02:00
76ba24e527 [wip] tim1 as clock source 3 channels 2023-08-12 19:24:15 +02:00
dd8c727f0b [fix] proper function for start pwm timer 2023-08-12 19:23:37 +02:00
843e74ded0 [fix] longest timout for spi 2023-08-12 19:21:55 +02:00
31 changed files with 1600 additions and 1112 deletions

View File

@@ -14,7 +14,6 @@
"servertype": "jlink", "servertype": "jlink",
"device": "STM32F303RE", "device": "STM32F303RE",
"interface": "swd", "interface": "swd",
"runToMain": true,
"svdFile": "STM32F303xE.svd", "svdFile": "STM32F303xE.svd",
"preLaunchTask": "${defaultBuildTask}", "preLaunchTask": "${defaultBuildTask}",
"rttConfig": { "rttConfig": {

View File

@@ -17,7 +17,14 @@
"tim.h": "c", "tim.h": "c",
"ulog.h": "c", "ulog.h": "c",
"ctrl_generator.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 "cortex-debug.variableUseNaturalFormat": true
} }

View File

@@ -32,19 +32,19 @@ extern "C" {
/* USER CODE END Includes */ /* USER CODE END Includes */
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim17;
/* USER CODE BEGIN Private defines */ /* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */ /* USER CODE END Private defines */
void MX_TIM1_Init(void);
void MX_TIM2_Init(void); void MX_TIM2_Init(void);
void MX_TIM3_Init(void); void MX_TIM3_Init(void);
void MX_TIM17_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);

View File

@@ -100,46 +100,49 @@ int main(void)
MX_SPI3_Init(); MX_SPI3_Init();
MX_TIM2_Init(); MX_TIM2_Init();
MX_TIM3_Init(); MX_TIM3_Init();
MX_TIM17_Init(); MX_TIM1_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
ulog_init(); ulog_init();
ulog_subscribe(RTT_console_logger, ULOG_TRACE_LEVEL); ulog_subscribe(RTT_console_logger, ULOG_TRACE_LEVEL);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
// SEGGER_RTT_WriteString(0, "App start...\n"); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
ULOG_INFO("start app..."); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
// SEGGER_RTT_WriteString(0, "App start...\n");
ULOG_INFO("start app...");
hst7565.hspi = &hspi3; hst7565.hspi = &hspi3;
hst7565.cs_port = ST7565_CS_GPIO_Port; hst7565.cs_port = ST7565_CS_GPIO_Port;
hst7565.cs_pin = ST7565_CS_Pin; hst7565.cs_pin = ST7565_CS_Pin;
hst7565.a0_port = ST7565_A0_GPIO_Port; hst7565.a0_port = ST7565_A0_GPIO_Port;
hst7565.a0_pin = ST7565_A0_Pin; hst7565.a0_pin = ST7565_A0_Pin;
hst7565.rst_port = ST7565_RST_GPIO_Port; hst7565.rst_port = ST7565_RST_GPIO_Port;
hst7565.rst_pin = ST7565_RST_Pin; hst7565.rst_pin = ST7565_RST_Pin;
ST7565_Init(&hst7565, &disp); ST7565_Init(&hst7565, &disp);
/* USER CODE END 2 */ /* USER CODE END 2 */
/* Infinite loop */ /* Infinite loop */
/* USER CODE BEGIN WHILE */ /* USER CODE BEGIN WHILE */
DISP_clearScreen(&disp); DISP_clearScreen(&disp);
ST7565_DisplayAll(&hst7565); ST7565_DisplayAll(&hst7565);
HAL_Delay(1000); HAL_Delay(1000);
uint32_t last_tick = HAL_GetTick(); uint32_t last_tick = HAL_GetTick();
APP_init(&app_data); APP_init(&app_data);
while (1) while (1)
{ {
CTRL_buttonsHandler(); CTRL_buttonsHandler();
if (HAL_GetTick() - last_tick > 100) if (HAL_GetTick() - last_tick > 100)
{ {
last_tick = HAL_GetTick(); last_tick = HAL_GetTick();
ST7565_DisplayAll(&hst7565); ST7565_DisplayAll(&hst7565);
LAY_drawDisplayLayout(&disp, &app_data); LAY_drawDisplayLayout(&disp, &app_data);
} }
/* USER CODE END WHILE */ /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ /* USER CODE BEGIN 3 */
} }
/* USER CODE END 3 */ /* USER CODE END 3 */
} }
@@ -182,11 +185,11 @@ void SystemClock_Config(void)
Error_Handler(); Error_Handler();
} }
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1
|RCC_PERIPHCLK_TIM17|RCC_PERIPHCLK_TIM2 |RCC_PERIPHCLK_TIM1|RCC_PERIPHCLK_TIM2
|RCC_PERIPHCLK_TIM34; |RCC_PERIPHCLK_TIM34;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
PeriphClkInit.Tim17ClockSelection = RCC_TIM17CLK_HCLK; PeriphClkInit.Tim1ClockSelection = RCC_TIM1CLK_PLLCLK;
PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK; PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK;
PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
@@ -198,10 +201,10 @@ void SystemClock_Config(void)
/* USER CODE BEGIN 4 */ /* USER CODE BEGIN 4 */
void RTT_console_logger(ulog_level_t severity, char *msg) void RTT_console_logger(ulog_level_t severity, char *msg)
{ {
SEGGER_RTT_printf(0, "[%s]: %s\n", SEGGER_RTT_printf(0, "[%s]: %s\n",
// HAL_GetTick(), // user defined function // HAL_GetTick(), // user defined function
ulog_level_name(severity), ulog_level_name(severity),
msg); msg);
} }
/* USER CODE END 4 */ /* USER CODE END 4 */
@@ -212,11 +215,11 @@ void RTT_console_logger(ulog_level_t severity, char *msg)
void Error_Handler(void) void Error_Handler(void)
{ {
/* USER CODE BEGIN Error_Handler_Debug */ /* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */ /* User can add his own implementation to report the HAL error return state */
__disable_irq(); __disable_irq();
while (1) while (1)
{ {
} }
/* USER CODE END Error_Handler_Debug */ /* USER CODE END Error_Handler_Debug */
} }
@@ -231,8 +234,8 @@ void Error_Handler(void)
void assert_failed(uint8_t *file, uint32_t line) void assert_failed(uint8_t *file, uint32_t line)
{ {
/* USER CODE BEGIN 6 */ /* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number, /* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */ /* USER CODE END 6 */
} }
#endif /* USE_FULL_ASSERT */ #endif /* USE_FULL_ASSERT */

View File

@@ -24,10 +24,94 @@
/* USER CODE END 0 */ /* USER CODE END 0 */
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim17;
/* TIM1 init function */
void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 5;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 3;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != 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.Break2State = TIM_BREAK2_DISABLE;
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
sBreakDeadTimeConfig.Break2Filter = 0;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&htim1);
}
/* TIM2 init function */ /* TIM2 init function */
void MX_TIM2_Init(void) void MX_TIM2_Init(void)
{ {
@@ -111,70 +195,23 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 2 */ /* 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) void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{ {
if(tim_baseHandle->Instance==TIM2) if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM2)
{ {
/* USER CODE BEGIN TIM2_MspInit 0 */ /* USER CODE BEGIN TIM2_MspInit 0 */
@@ -185,17 +222,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM2_MspInit 1 */ /* 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) void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle)
@@ -231,26 +257,28 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{ {
GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM17) if(timHandle->Instance==TIM1)
{ {
/* USER CODE BEGIN TIM17_MspPostInit 0 */ /* USER CODE BEGIN TIM1_MspPostInit 0 */
/* USER CODE END TIM17_MspPostInit 0 */ /* USER CODE END TIM1_MspPostInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE();
/**TIM17 GPIO Configuration /**TIM1 GPIO Configuration
PB5 ------> TIM17_CH1 PC1 ------> TIM1_CH2
PC2 ------> TIM1_CH3
PC3 ------> TIM1_CH4
*/ */
GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_TIM17; GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* USER CODE BEGIN TIM17_MspPostInit 1 */ /* USER CODE BEGIN TIM1_MspPostInit 1 */
/* USER CODE END TIM17_MspPostInit 1 */ /* USER CODE END TIM1_MspPostInit 1 */
} }
} }
@@ -258,7 +286,18 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{ {
if(tim_baseHandle->Instance==TIM2) if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */
/* USER CODE END TIM1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM2)
{ {
/* USER CODE BEGIN TIM2_MspDeInit 0 */ /* USER CODE BEGIN TIM2_MspDeInit 0 */
@@ -269,17 +308,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM2_MspDeInit 1 */ /* 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) void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle)

View File

@@ -1,5 +1,5 @@
########################################################################################################################## ##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Tue Aug 01 10:57:07 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 C_SOURCES += ../shared_libs/drivers/st7565/st7565.c
# hw_button # hw_button
C_SOURCES += ../shared_libs/drivers/hw_button/hw_button.c 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 # display
C_SOURCES += ../shared_libs/display/display_gfx.c C_SOURCES += ../shared_libs/display/display_gfx.c
C_SOURCES += ../shared_libs/display/font_gfx.c C_SOURCES += ../shared_libs/display/font_gfx.c
# bitmaps # bitmaps
C_SOURCES += ../shared_libs/bitmaps/bitmap_disp_buttons.c C_SOURCES += ../shared_libs/bitmaps/bitmap_disp_buttons.c
C_SOURCES += ../shared_libs/bitmaps/bitmap_font_5x7.c C_SOURCES += ../shared_libs/bitmaps/bitmap_font_5x7.c
C_SOURCES += ../shared_libs/bitmaps/bitmap_wave.c C_SOURCES += ../shared_libs/bitmaps/bitmap_wave.c
# display_layout # display_layout
C_SOURCES += ../shared_libs/disp_layout/disp_layout.c C_SOURCES += ../shared_libs/disp_layout/disp_layout.c
# controllers # controllers
C_SOURCES += ../shared_libs/controllers/ctrl_app.c
C_SOURCES += ../shared_libs/controllers/ctrl_bottom_button.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_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_encoder.c
C_SOURCES += ../shared_libs/controllers/ctrl_generator.c C_SOURCES += ../shared_libs/controllers/ctrl_signal_gen.c
# utils/printf # utils/printf
C_SOURCES += ../shared_libs/utils/printf/printf.c 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 C_INCLUDES += -I../shared_libs/drivers/st7565
# hw_button includes # hw_button includes
C_INCLUDES += -I../shared_libs/drivers/hw_button 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 # display includes
C_INCLUDES += -I../shared_libs/display C_INCLUDES += -I../shared_libs/display
# bitmaps includes # 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/printf
C_INCLUDES += -I../shared_libs/utils/rtt C_INCLUDES += -I../shared_libs/utils/rtt
C_INCLUDES += -I../shared_libs/utils/ulog C_INCLUDES += -I../shared_libs/utils/ulog
C_INCLUDES += -I../shared_libs/utils/spi_cs
# compile gcc flags # compile gcc flags

View File

@@ -13,53 +13,55 @@ Mcu.IP2=RCC
Mcu.IP3=SPI2 Mcu.IP3=SPI2
Mcu.IP4=SPI3 Mcu.IP4=SPI3
Mcu.IP5=SYS Mcu.IP5=SYS
Mcu.IP6=TIM2 Mcu.IP6=TIM1
Mcu.IP7=TIM3 Mcu.IP7=TIM2
Mcu.IP8=TIM17 Mcu.IP8=TIM3
Mcu.IP9=USART2 Mcu.IP9=USART2
Mcu.IPNb=10 Mcu.IPNb=10
Mcu.Name=STM32F303R(D-E)Tx Mcu.Name=STM32F303R(D-E)Tx
Mcu.Package=LQFP64 Mcu.Package=LQFP64
Mcu.Pin0=PC13 Mcu.Pin0=PC13
Mcu.Pin1=PC14-OSC32_IN Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=PA5 Mcu.Pin10=PA2
Mcu.Pin11=PA6 Mcu.Pin11=PA3
Mcu.Pin12=PA7 Mcu.Pin12=PA4
Mcu.Pin13=PB10 Mcu.Pin13=PA5
Mcu.Pin14=PB11 Mcu.Pin14=PA6
Mcu.Pin15=PB12 Mcu.Pin15=PA7
Mcu.Pin16=PB13 Mcu.Pin16=PB10
Mcu.Pin17=PB14 Mcu.Pin17=PB11
Mcu.Pin18=PB15 Mcu.Pin18=PB12
Mcu.Pin19=PC8 Mcu.Pin19=PB13
Mcu.Pin2=PC15-OSC32_OUT Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin20=PC9 Mcu.Pin20=PB14
Mcu.Pin21=PA8 Mcu.Pin21=PB15
Mcu.Pin22=PA9 Mcu.Pin22=PC8
Mcu.Pin23=PA10 Mcu.Pin23=PC9
Mcu.Pin24=PA11 Mcu.Pin24=PA8
Mcu.Pin25=PA12 Mcu.Pin25=PA9
Mcu.Pin26=PA13 Mcu.Pin26=PA10
Mcu.Pin27=PA14 Mcu.Pin27=PA11
Mcu.Pin28=PC10 Mcu.Pin28=PA12
Mcu.Pin29=PC11 Mcu.Pin29=PA13
Mcu.Pin3=PF0-OSC_IN Mcu.Pin3=PF0-OSC_IN
Mcu.Pin30=PC12 Mcu.Pin30=PA14
Mcu.Pin31=PB3 Mcu.Pin31=PC10
Mcu.Pin32=PB5 Mcu.Pin32=PC11
Mcu.Pin33=PB6 Mcu.Pin33=PC12
Mcu.Pin34=PB7 Mcu.Pin34=PB3
Mcu.Pin35=PB9 Mcu.Pin35=PB6
Mcu.Pin36=VP_SYS_VS_Systick Mcu.Pin36=PB7
Mcu.Pin37=VP_TIM2_VS_ClockSourceINT Mcu.Pin37=PB9
Mcu.Pin38=VP_TIM17_VS_ClockSourceINT Mcu.Pin38=VP_SYS_VS_Systick
Mcu.Pin39=VP_TIM1_VS_ClockSourceINT
Mcu.Pin4=PF1-OSC_OUT Mcu.Pin4=PF1-OSC_OUT
Mcu.Pin5=PA0 Mcu.Pin40=VP_TIM2_VS_ClockSourceINT
Mcu.Pin6=PA1 Mcu.Pin5=PC1
Mcu.Pin7=PA2 Mcu.Pin6=PC2
Mcu.Pin8=PA3 Mcu.Pin7=PC3
Mcu.Pin9=PA4 Mcu.Pin8=PA0
Mcu.PinsNb=39 Mcu.Pin9=PA1
Mcu.PinsNb=41
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32F303RETx Mcu.UserName=STM32F303RETx
@@ -163,7 +165,6 @@ PB3.GPIOParameters=GPIO_Label
PB3.GPIO_Label=SWO PB3.GPIO_Label=SWO
PB3.Locked=true PB3.Locked=true
PB3.Signal=SYS_JTDO-TRACESWO PB3.Signal=SYS_JTDO-TRACESWO
PB5.Signal=S_TIM17_CH1
PB6.Locked=true PB6.Locked=true
PB6.Mode=I2C PB6.Mode=I2C
PB6.Signal=I2C1_SCL PB6.Signal=I2C1_SCL
@@ -173,6 +174,9 @@ PB9.GPIOParameters=GPIO_Label
PB9.GPIO_Label=AMP2_CS PB9.GPIO_Label=AMP2_CS
PB9.Locked=true PB9.Locked=true
PB9.Signal=GPIO_Output PB9.Signal=GPIO_Output
PC1.GPIOParameters=GPIO_Speed
PC1.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PC1.Signal=S_TIM1_CH2
PC10.GPIOParameters=GPIO_Label PC10.GPIOParameters=GPIO_Label
PC10.GPIO_Label=ST7565_SCK PC10.GPIO_Label=ST7565_SCK
PC10.Locked=true PC10.Locked=true
@@ -197,6 +201,12 @@ PC14-OSC32_IN.Signal=RCC_OSC32_IN
PC15-OSC32_OUT.Locked=true PC15-OSC32_OUT.Locked=true
PC15-OSC32_OUT.Mode=LSE-External-Oscillator PC15-OSC32_OUT.Mode=LSE-External-Oscillator
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
PC2.GPIOParameters=GPIO_Speed
PC2.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PC2.Signal=S_TIM1_CH3
PC3.GPIOParameters=GPIO_Speed
PC3.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PC3.Signal=S_TIM1_CH4
PC8.GPIOParameters=GPIO_Label PC8.GPIOParameters=GPIO_Label
PC8.GPIO_Label=ST7565_RST PC8.GPIO_Label=ST7565_RST
PC8.Locked=true PC8.Locked=true
@@ -238,7 +248,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Makefile ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation= ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_SPI3_Init-SPI3-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_SPI3_Init-SPI3-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true,9-MX_TIM17_Init-TIM17-false-HAL-true,10-MX_TIM1_Init-TIM1-false-HAL-true
RCC.ADC12outputFreq_Value=72000000 RCC.ADC12outputFreq_Value=72000000
RCC.ADC34outputFreq_Value=72000000 RCC.ADC34outputFreq_Value=72000000
RCC.AHBFreq_Value=72000000 RCC.AHBFreq_Value=72000000
@@ -257,7 +267,7 @@ RCC.I2C1Freq_Value=8000000
RCC.I2C2Freq_Value=8000000 RCC.I2C2Freq_Value=8000000
RCC.I2C3Freq_Value=8000000 RCC.I2C3Freq_Value=8000000
RCC.I2SClocksFreq_Value=72000000 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.LSI_VALUE=40000
RCC.MCOFreq_Value=9000000 RCC.MCOFreq_Value=9000000
RCC.PLLCLKFreq_Value=72000000 RCC.PLLCLKFreq_Value=72000000
@@ -277,7 +287,8 @@ RCC.SYSCLKSourceVirtual=RCC_SYSCLKSOURCE_PLLCLK
RCC.TIM15Freq_Value=72000000 RCC.TIM15Freq_Value=72000000
RCC.TIM16Freq_Value=72000000 RCC.TIM16Freq_Value=72000000
RCC.TIM17Freq_Value=72000000 RCC.TIM17Freq_Value=72000000
RCC.TIM1Freq_Value=72000000 RCC.TIM1Freq_Value=144000000
RCC.TIM1Selection=RCC_TIM1CLK_PLLCLK
RCC.TIM20Freq_Value=72000000 RCC.TIM20Freq_Value=72000000
RCC.TIM2Freq_Value=72000000 RCC.TIM2Freq_Value=72000000
RCC.TIM3Freq_Value=72000000 RCC.TIM3Freq_Value=72000000
@@ -291,8 +302,12 @@ RCC.USBFreq_Value=72000000
RCC.VCOOutput2Freq_Value=8000000 RCC.VCOOutput2Freq_Value=8000000
SH.GPXTI13.0=GPIO_EXTI13 SH.GPXTI13.0=GPIO_EXTI13
SH.GPXTI13.ConfNb=1 SH.GPXTI13.ConfNb=1
SH.S_TIM17_CH1.0=TIM17_CH1,PWM Generation1 CH1 SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2
SH.S_TIM17_CH1.ConfNb=1 SH.S_TIM1_CH2.ConfNb=1
SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3
SH.S_TIM1_CH3.ConfNb=1
SH.S_TIM1_CH4.0=TIM1_CH4,PWM Generation4 CH4
SH.S_TIM1_CH4.ConfNb=1
SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface
SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM3_CH1.ConfNb=1
SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface
@@ -313,12 +328,16 @@ SPI3.Direction=SPI_DIRECTION_1LINE
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize
SPI3.Mode=SPI_MODE_MASTER SPI3.Mode=SPI_MODE_MASTER
SPI3.VirtualType=VM_MASTER SPI3.VirtualType=VM_MASTER
TIM17.Channel=TIM_CHANNEL_1 TIM1.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM17.IPParameters=Channel,Period,OCFastMode_PWM,OCIdleState_1,Pulse TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM17.OCFastMode_PWM=TIM_OCFAST_ENABLE TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM17.OCIdleState_1=TIM_OCIDLESTATE_RESET TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM17.Period=2 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
TIM17.Pulse=1 TIM1.OCFastMode_PWM-PWM\ Generation4\ CH4=TIM_OCFAST_ENABLE
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.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE
TIM2.IPParameters=AutoReloadPreload TIM2.IPParameters=AutoReloadPreload
TIM3.IC1Filter=15 TIM3.IC1Filter=15
@@ -329,8 +348,8 @@ USART2.IPParameters=VirtualMode-Asynchronous
USART2.VirtualMode-Asynchronous=VM_ASYNC USART2.VirtualMode-Asynchronous=VM_ASYNC
VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
board=NUCLEO-F303RE board=NUCLEO-F303RE

View File

@@ -1,14 +1,14 @@
#include "main.h" #include "main.h"
#include "tim.h" #include "tim.h"
#include "hw_button.h"
#include "ctrl_bottom_button.h" #include "ctrl_bottom_button.h"
#include "ctrl_channel_button.h" #include "ctrl_channel_button.h"
#include "ctrl_encoder.h" #include "ctrl_encoder.h"
#include "ctrl_generator.h" #include "ctrl_disp_button.h"
#include "ctrl_signal_gen.h"
#include "ctrl_app.h" #include "ctrl_app.h"
typedef void (*btn_action_t)(void); typedef void (*btn_action_t)(APP_data_t *app_data);
typedef struct typedef struct
{ {
@@ -16,69 +16,46 @@ typedef struct
BITMAP_buttonName_t bitmap_name; BITMAP_buttonName_t bitmap_name;
} CMD_button_t; } 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 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 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 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 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 APP_data_t *_app_data;
static GEN_sig_t signal_gen[CHANNEL_MAX] = { static dds_gen_t dds_gen[DDS_CH_MAX] = {
{.type = GEN_FG_TYPE, .gen = &func_gen[0]}, {.super.type = GEN_FG_TYPE, .dds_ch = DDS_CH1},
{.type = GEN_FG_TYPE, .gen = &func_gen[1]}, {.super.type = GEN_FG_TYPE, .dds_ch = DDS_CH2},
{.type = GEN_FG_TYPE, .gen = &func_gen[2]}, {.super.type = GEN_FG_TYPE, .dds_ch = DDS_CH3},
{.type = GEN_PWM_TYPE, .gen = &pwm_gen[0]}, };
{.type = GEN_PWM_TYPE, .gen = &pwm_gen[1]}, static pwm_gen_t pwm_gen[PWM_CH_MAX] = {
{.type = GEN_PWM_TYPE, .gen = &pwm_gen[2]}, {.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) static signal_gen_t *signal_gen[CHANNEL_MAX] = {
{ &dds_gen[DDS_CH1].super,
for (GEN_channel_t channel = 0; channel < CHANNEL_MAX; channel++) &dds_gen[DDS_CH2].super,
{ &dds_gen[DDS_CH3].super,
switch (signal_gen[channel].type) &pwm_gen[PWM_CH1].super,
{ &pwm_gen[PWM_CH2].super,
case GEN_FG_TYPE: &pwm_gen[PWM_CH3].super,
{ };
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;
}
}
}
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); CTRL_bottomButtonInit();
setWave(&signal_gen[channel], channel); CTRL_channelButtonInit();
setPhase(&signal_gen[channel], channel);
setAmplitude(&signal_gen[channel], channel);
setEnabled(&signal_gen[channel], channel);
// setOfsset(&signal_gen[channel], channel);
} }
void APP_init(APP_data_t *app_data) 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->phas_focus_digit = 0;
_app_data->duty_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];
_app_data->curr_gen = signal_gen[CHANNEL1].gen;
_app_data->curr_state_lay = LAY_MAIN; _app_data->curr_state_lay = LAY_MAIN;
_app_data->curr_state_btn = BTN_MAIN_FG; _app_data->curr_state_btn = BTN_MAIN_FG;
_app_data->curr_channel = CHANNEL1; _app_data->curr_channel = CHANNEL1;
_app_data->isChannelChange = 1; // _app_data->isChannelChange = 1;
_app_data->isGraphChange = 1; // _app_data->isGraphChange = 1;
_app_data->isValueChange = 1; // _app_data->isValueChange = 1;
_app_data->isButtonChange = 1; // _app_data->isButtonChange = 1;
_app_data->isButtonBlink = 1; // _app_data->isButtonBlink = 1;
_app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE | UPDATE_CHANNEL;
_signalGenDefaultValues();
CTRL_buttonsInit(); CTRL_buttonsInit();
gen_init(); _signalGenDefaultValues();
GEN_init(signal_gen);
_setGenInitailState(CHANNEL1); _setGenInitailState(CHANNEL1);
_setGenInitailState(CHANNEL2); _setGenInitailState(CHANNEL2);
} }
void CTRL_buttonsInit(void) //****************************
{ // Handlers
//****************************
CTRL_bottomButtonInit();
CTRL_channelButtonInit();
}
void CTRL_buttonsHandler(void) void CTRL_buttonsHandler(void)
{ {
@@ -124,11 +98,33 @@ void CTRL_buttonsHandler(void)
CTRL_encoderHandler(); CTRL_encoderHandler();
} }
//****************************
// Events
//****************************
void CTRL_pushedDispBtnEvent(ButtonKey_t *key) void CTRL_pushedDispBtnEvent(ButtonKey_t *key)
{ {
ULOG_TRACE("Disp btn: %d", key->instance); ULOG_TRACE("Disp btn: %d", key->instance);
last_key = btn_hw_to_disp[key->instance]; _app_data->last_key = btn_hw_to_disp[key->instance];
btn_command[_app_data->curr_state_btn][last_key].command(); 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) void CTRL_pushedChanBtnEvent(ButtonKey_t *key)
@@ -136,18 +132,18 @@ void CTRL_pushedChanBtnEvent(ButtonKey_t *key)
ULOG_TRACE("Chan btn: %d", key->instance); ULOG_TRACE("Chan btn: %d", key->instance);
GEN_channel_t channel = btn_ch_to_chan[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];
_app_data->curr_gen = signal_gen[channel].gen;
_app_data->curr_state_lay = LAY_MAIN; _app_data->curr_state_lay = LAY_MAIN;
_app_data->curr_state_btn = BTN_MAIN_FG; _app_data->curr_state_btn = BTN_MAIN_FG;
_app_data->curr_channel = channel; _app_data->curr_channel = channel;
_app_data->isChannelChange = 1; // _app_data->isChannelChange = 1;
_app_data->isGraphChange = 1; // _app_data->isGraphChange = 1;
_app_data->isValueChange = 1; // _app_data->isValueChange = 1;
_app_data->isButtonChange = 1; // _app_data->isButtonChange = 1;
_app_data->isButtonBlink = 1; // _app_data->isButtonBlink = 1;
_app_data->disp_update |= UPDATE_BUTTON | UPDATE_GRAPH | UPDATE_VALUE | UPDATE_CHANNEL;
} }
void CTRL_longPushedChanBtnEvent(ButtonKey_t *key) void CTRL_longPushedChanBtnEvent(ButtonKey_t *key)
@@ -155,87 +151,82 @@ void CTRL_longPushedChanBtnEvent(ButtonKey_t *key)
ULOG_TRACE("Chan btn(long): %d", key->instance); ULOG_TRACE("Chan btn(long): %d", key->instance);
GEN_channel_t channel = btn_ch_to_chan[key->instance]; GEN_channel_t channel = btn_ch_to_chan[key->instance];
if (channel == CHANNEL2) switch (signal_gen[channel]->type)
{
if (HAL_TIM_Base_Start(&htim17) == HAL_ERROR)
{
HAL_TIM_Base_Stop(&htim17);
}
}
switch (signal_gen[channel].type)
{ {
case GEN_FG_TYPE: case GEN_FG_TYPE:
{ {
GEN_fg_t *gen = signal_gen[channel].gen; dds_gen_t *dds_gen = (dds_gen_t *)signal_gen[channel];
gen->enabled = gen->enabled ? FALSE : TRUE; dds_gen->settings.enabled = dds_gen->settings.enabled ? FALSE : TRUE;
setEnabled(&signal_gen[channel], channel); setEnabled(signal_gen[channel]);
break; break;
} }
case GEN_PWM_TYPE: case GEN_PWM_TYPE:
{ {
GEN_pwm_t *gen = signal_gen[channel].gen; pwm_gen_t *pwm_gen = (pwm_gen_t *)signal_gen[channel];
gen->enabled = gen->enabled ? FALSE : TRUE; pwm_gen->settings.enabled = pwm_gen->settings.enabled ? FALSE : TRUE;
setEnabled(&signal_gen[channel], channel); setEnabled(signal_gen[channel]);
break; break;
} }
default: default:
ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, _app_data->curr_gen->type);
break; 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) switch (_app_data->curr_state_lay)
{ {
case LAY_FREQ: 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("<FG> New freq: %lu", new_freq); ULOG_DEBUG("<FG> New freq: %lu", new_freq);
if (new_freq > MAX_FREQ) if (new_freq > MAX_FREQ)
{ {
return; return;
} }
gen->frequency = new_freq; dds_gen->settings.frequency = new_freq;
setFreq(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); setFrequency(&dds_gen->super);
break; break;
} }
case LAY_AMPL: 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("<FG> New ampl: %u", new_ampl); ULOG_DEBUG("<FG> 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; return;
} }
gen->amplitude = new_ampl; dds_gen->settings.amplitude = new_ampl;
setAmplitude(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); setAmplitude(&dds_gen->super);
break; break;
} }
case LAY_OFFS: 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("<FG> New offs: %i", new_offs); ULOG_DEBUG("<FG> 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; return;
} }
gen->offset = new_offs; dds_gen->settings.offset = new_offs;
setOfsset(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); setOfsset(&dds_gen->super);
break; break;
} }
case LAY_PHAS: 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("<FG> New phas: %u", new_phas); ULOG_DEBUG("<FG> New phas: %u", new_phas);
if (new_phas > MAX_PHAS) if (new_phas > MAX_PHAS)
{ {
return; return;
} }
gen->phase = new_phas; dds_gen->settings.phase = new_phas;
setPhase(&signal_gen[_app_data->curr_channel], _app_data->curr_channel); setPhase(&dds_gen->super);
break; break;
} }
default: default:
@@ -243,72 +234,73 @@ static void _changeValueFunGen(int8_t dir)
return; return;
} }
_app_data->isValueChange = 1; // _app_data->isValueChange = 1;
_app_data->isGraphChange = 1; // _app_data->isGraphChange = 1;
_app_data->disp_update |= UPDATE_GRAPH | UPDATE_VALUE;
} }
static void _changeValuePwmGen(int8_t dir) 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) switch (_app_data->curr_state_lay)
{ {
case LAY_FREQ: 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("<PWM> New freq: %lu", new_freq); ULOG_DEBUG("<PWM> New freq: %lu", new_freq);
if (new_freq > MAX_FREQ) if (new_freq > MAX_FREQ)
{ {
return; return;
} }
gen->frequency = new_freq; pwm_gen->settings.frequency = new_freq;
break; break;
} }
case LAY_AMPL: 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("<PWM> New ampl: %u", new_ampl); ULOG_DEBUG("<PWM> 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; return;
} }
gen->amplitude = new_ampl; pwm_gen->settings.amplitude = new_ampl;
break; break;
} }
case LAY_OFFS: 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("<PWM> New offs: %i", new_offs); ULOG_DEBUG("<PWM> 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; return;
} }
gen->offset = new_offs; pwm_gen->settings.offset = new_offs;
break; break;
} }
case LAY_PHAS: 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("<PWM> New phas: %u", new_phas); ULOG_DEBUG("<PWM> New phas: %u", new_phas);
if (new_phas > MAX_PHAS) if (new_phas > MAX_PHAS)
{ {
return; return;
} }
gen->phase = new_phas; pwm_gen->settings.phase = new_phas;
break; break;
} }
case LAY_DUTY: 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("<PWM> New duty: %u", new_duty); ULOG_DEBUG("<PWM> New duty: %u", new_duty);
if (new_duty > MAX_DUTY) if (new_duty > MAX_DUTY)
{ {
return; return;
} }
gen->duty = new_duty; pwm_gen->settings.duty = new_duty;
break; break;
} }
default: default:
@@ -316,343 +308,142 @@ static void _changeValuePwmGen(int8_t dir)
return; return;
} }
_app_data->isValueChange = 1; // _app_data->isValueChange = 1;
_app_data->isGraphChange = 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); for (GEN_channel_t channel = CHANNEL1; channel < CHANNEL_MAX; channel++)
switch (_app_data->curr_gen_type)
{ {
case GEN_FG_TYPE: switch (signal_gen[channel]->type)
_changeValueFunGen(enc / 2); {
break; case GEN_FG_TYPE:
case GEN_PWM_TYPE: {
_changeValuePwmGen(enc / 2); dds_gen_t *dds_gen = (dds_gen_t *)signal_gen[channel];
break; dds_gen->settings.frequency = 1000;
dds_gen->settings.amplitude = 100;
default: dds_gen->settings.offset = 165;
ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, _app_data->curr_gen_type); dds_gen->settings.phase = 0;
break; 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) inline BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn)
{ {
return btn_command[_app_data->curr_state_btn][disp_btn].bitmap_name; 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] = { static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX] = {
{ {
// BTN_MAIN_FG // BTN_MAIN_FG
{_enterToFreqLayout, BITMAP_BTN_FREQ}, {enterToFreqLayout, BITMAP_BTN_FREQ},
{_enterToAmplLayout, BITMAP_BTN_AMPL}, {enterToAmplLayout, BITMAP_BTN_AMPL},
{_enterToOffslLayout, BITMAP_BTN_OFFS}, {enterToOffslLayout, BITMAP_BTN_OFFS},
{_enterToPhasLayout, BITMAP_BTN_PHAS}, {enterToPhasLayout, BITMAP_BTN_PHAS},
{_enterToWavelLayout, BITMAP_BTN_WAVE}, {enterToWavelLayout, BITMAP_BTN_WAVE},
}, },
{ {
// BTN_MAIN_PWM // BTN_MAIN_PWM
{_enterToFreqLayout, BITMAP_BTN_FREQ}, {enterToFreqLayout, BITMAP_BTN_FREQ},
{_enterToAmplLayout, BITMAP_BTN_AMPL}, {enterToAmplLayout, BITMAP_BTN_AMPL},
{_enterToOffslLayout, BITMAP_BTN_OFFS}, {enterToOffslLayout, BITMAP_BTN_OFFS},
{_enterToPhasLayout, BITMAP_BTN_PHAS}, {enterToPhasLayout, BITMAP_BTN_PHAS},
{_enterToDutyLayout, BITMAP_BTN_NONE}, {enterToDutyLayout, BITMAP_BTN_NONE},
}, },
{ {
// BTN_FREQ // BTN_FREQ
{_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, {moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT},
{_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, {moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_FREQ_MIN // BTN_FREQ_MIN
{_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, {moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT},
{_doNoting, BITMAP_BTN_EMPTY}, {doNoting, BITMAP_BTN_EMPTY},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_FREQ_MAX // BTN_FREQ_MAX
{_doNoting, BITMAP_BTN_EMPTY}, {doNoting, BITMAP_BTN_EMPTY},
{_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, {moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_AMPL // BTN_AMPL
{_setTo1xFocusNumber, BITMAP_BTN_X1}, {setTo1xFocusNumber, BITMAP_BTN_X1},
{_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, {setTo0_1xFocusNumber, BITMAP_BTN_X0_1},
{_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, {setTo0_01xFocusNumber, BITMAP_BTN_X0_01},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_OFFS // BTN_OFFS
{_setTo1xFocusNumber, BITMAP_BTN_X1}, {setTo1xFocusNumber, BITMAP_BTN_X1},
{_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, {setTo0_1xFocusNumber, BITMAP_BTN_X0_1},
{_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, {setTo0_01xFocusNumber, BITMAP_BTN_X0_01},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_PHAS // BTN_PHAS
{_setTo10xFocusNumber, BITMAP_BTN_X10}, {setTo10xFocusNumber, BITMAP_BTN_X10},
{_setTo1xFocusNumber, BITMAP_BTN_X1}, {setTo1xFocusNumber, BITMAP_BTN_X1},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_DUTY // BTN_DUTY
{_setTo10xFocusNumber, BITMAP_BTN_X10}, {setTo10xFocusNumber, BITMAP_BTN_X10},
{_setTo1xFocusNumber, BITMAP_BTN_X1}, {setTo1xFocusNumber, BITMAP_BTN_X1},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
{ {
// BTN_WAVE // BTN_WAVE
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_doNoting, BITMAP_BTN_NONE}, {doNoting, BITMAP_BTN_NONE},
{_backToMain, BITMAP_BTN_BACK}, {backToMain, BITMAP_BTN_BACK},
}, },
}; };

View File

@@ -3,56 +3,6 @@
#include "bitmap_disp_buttons.h" #include "bitmap_disp_buttons.h"
#include "ctrl_app_types.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 APP_init(APP_data_t *app_data);
void CTRL_buttonsInit(void); void CTRL_buttonsInit(void);

View File

@@ -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;

View File

@@ -1,78 +1,106 @@
#pragma once #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 typedef struct
#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, uint32_t frequency;
TRUE uint16_t amplitude;
} bool_t; 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, uint32_t frequency;
GEN_PWM_TYPE, uint16_t amplitude;
GEN_TYPE_MAX int16_t offset;
} GEN_type_t; uint16_t phase;
uint8_t wave;
uint8_t link;
uint8_t enabled;
} dds_settings_t;
typedef enum typedef struct
{ {
CHANNEL1, GPIO_TypeDef *port;
CHANNEL2, uint16_t pin;
CHANNEL3, } led_handle_t;
CHANNEL4,
CHANNEL5,
CHANNEL6,
CHANNEL_MAX
} GEN_channel_t;
typedef enum typedef struct FG_handle_s
{ {
GEN_SIN, ad9833_handle_t hdds;
GEN_TRI, ltc2631_handle_t hoffs;
GEN_SQR, mcp41x_handle_t hampl;
GEN_WAVE_MAX, led_handle_t hled;
} GEN_wave_t; } dds_handle_t;
typedef enum typedef uint8_t timer_handle_t;
typedef struct
{ {
LAY_MAIN, timer_handle_t hpwm;
LAY_FREQ, ltc2631_handle_t hoffs;
LAY_AMPL, mcp41x_handle_t hampl;
LAY_OFFS, led_handle_t hled;
LAY_PHAS, } pwm_handle_t;
LAY_DUTY,
LAY_WAVE,
LAY_STATE_MAX
} STATE_layout_t;
typedef enum typedef struct
{ {
BTN_MAIN_FG, GEN_type_t const type;
BTN_MAIN_PWM, } signal_gen_t;
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 typedef struct
{ {
DISP_BTN_1, signal_gen_t *next;
DISP_BTN_2, signal_gen_t *prev;
DISP_BTN_3, } link_t;
DISP_BTN_4,
DISP_BTN_5, typedef struct
DISP_BTN_MAX, {
} LAY_dispBtn_t; 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;

View File

@@ -1,6 +1,4 @@
#include "main.h" #include "main.h"
#include "hw_button.h"
// #include "ctrl_app.h"
#include "ctrl_bottom_button.h" #include "ctrl_bottom_button.h"
static ButtonKey_t bottom_buttons[BTN_BOT_MAX]; static ButtonKey_t bottom_buttons[BTN_BOT_MAX];

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include "hw_button.h"
typedef enum typedef enum
{ {
BTN_BOT_1, BTN_BOT_1,

View File

@@ -1,5 +1,4 @@
#include "main.h" #include "main.h"
#include "hw_button.h"
#include "ctrl_channel_button.h" #include "ctrl_channel_button.h"
#define DUMMY_GPIO_Port B1_GPIO_Port #define DUMMY_GPIO_Port B1_GPIO_Port

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include "hw_button.h"
typedef enum typedef enum
{ {
BTN_CH_1, BTN_CH_1,

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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)
{
}

View File

@@ -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();

View File

@@ -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)
{
}

View File

@@ -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);

View File

@@ -74,7 +74,7 @@ static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data)
BITMAP_buttonName_t bitmap_idx; BITMAP_buttonName_t bitmap_idx;
for (LAY_dispBtn_t btn_idx = DISP_BTN_1; btn_idx < DISP_BTN_MAX; btn_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; continue;
} }
@@ -88,7 +88,7 @@ static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data)
else else
{ {
DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx], btn_pos_x[btn_idx], 53, BM_NORMAL); 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); 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) 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) 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) switch (app_data->curr_state_lay)
{ {
case LAY_FREQ: case LAY_FREQ:
_drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit); _drawFreqValueHelper(disp, fun_gen->settings.frequency, app_data->freq_focus_digit);
_drawMeterHelper(disp, "1", "1M", _calcMarkerPos(fun_gen->frequency, MAX_FREQ)); _drawMeterHelper(disp, "1", "1M", _calcMarkerPos(fun_gen->settings.frequency, MAX_FREQ));
break; break;
case LAY_AMPL: case LAY_AMPL:
_drawAmplValueHelper(disp, fun_gen->amplitude, app_data->ampl_focus_digit); _drawAmplValueHelper(disp, fun_gen->settings.amplitude, app_data->ampl_focus_digit);
_drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(fun_gen->amplitude, MAX_VOLT_POS)); _drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(fun_gen->settings.amplitude, MAX_VOLT_POS));
break; break;
case LAY_OFFS: case LAY_OFFS:
_drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit); _drawOffsValueHelper(disp, fun_gen->settings.offset, app_data->offs_focus_digit);
_drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(MAX_VOLT_POS + fun_gen->offset, MAX_VOLT_POS * 2)); _drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(MAX_VOLT_POS + fun_gen->settings.offset, MAX_VOLT_POS * 2));
break; break;
case LAY_PHAS: case LAY_PHAS:
_drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit); _drawPhaseValueHelper(disp, fun_gen->settings.phase, app_data->phas_focus_digit);
_drawMeterHelper(disp, "0", "360", _calcMarkerPos(fun_gen->phase, MAX_PHAS)); _drawMeterHelper(disp, "0", "360", _calcMarkerPos(fun_gen->settings.phase, MAX_PHAS));
break; break;
case LAY_MAIN: case LAY_MAIN:
DISP_clearRegion(disp, 62, 13, 66, 40); 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 *)"O:", 64, 33, BM_NORMAL);
DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL);
_drawFreqValue(disp, fun_gen->frequency, 13); _drawFreqValue(disp, fun_gen->settings.frequency, 13);
_drawAmplValue(disp, fun_gen->amplitude, 23); _drawAmplValue(disp, fun_gen->settings.amplitude, 23);
_drawOffsValue(disp, fun_gen->offset, 33); _drawOffsValue(disp, fun_gen->settings.offset, 33);
_drawPhasValue(disp, fun_gen->phase, 43); _drawPhasValue(disp, fun_gen->settings.phase, 43);
break; break;
default: 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) 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) // 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: case GEN_FG_TYPE:
_drawFuncGenValues(disp, app_data); _drawFuncGenValues(disp, app_data);
@@ -239,7 +239,7 @@ static void _drawValues(GFX_display_t *disp, APP_data_t *app_data)
break; break;
} }
app_data->isValueChange = 0; app_data->disp_update &= ~(UPDATE_VALUE);
} }
static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) 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) 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); DISP_clearRegion(disp, 3, 12, 57, 40);
switch (fun_gen->wave) switch (fun_gen->settings.wave)
{ {
case GEN_SIN: 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; break;
case GEN_TRI: 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; break;
case GEN_SQR: 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; break;
default: default:
break; break;
} }
_drawOffsetLine(disp, fun_gen->offset, fun_gen->amplitude); _drawOffsetLine(disp, fun_gen->settings.offset, fun_gen->settings.amplitude);
// _drawMaxAmpLine(disp, fun_gen->offset, fun_gen->amplitude); // _drawMaxAmpLine(disp, fun_gen->settings.offset, fun_gen->settings.amplitude);
} }
static void _drawPwmGenGraph(GFX_display_t *disp, APP_data_t *app_data) 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), // 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); DISP_drawVerticalLine(disp, 2, 12, 40, GFX_WHITE);
switch (app_data->curr_gen_type) switch (app_data->curr_gen->type)
{ {
case GEN_FG_TYPE: case GEN_FG_TYPE:
_drawFunGenGraph(disp, app_data); _drawFunGenGraph(disp, app_data);
@@ -307,7 +307,7 @@ static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data)
break; break;
} }
app_data->isGraphChange = 0; app_data->disp_update &= ~(UPDATE_GRAPH);
} }
static void _drawChannels(GFX_display_t *disp, APP_data_t *app_data) 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_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); 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) 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); _drawChannels(disp, app_data);
if (app_data->isValueChange) if (app_data->disp_update & UPDATE_VALUE)
_drawValues(disp, app_data); _drawValues(disp, app_data);
if (app_data->isGraphChange) if (app_data->disp_update & UPDATE_GRAPH)
_drawGraph(disp, app_data); _drawGraph(disp, app_data);
if (app_data->isButtonChange) if (app_data->disp_update & UPDATE_BUTTON)
_drawButtons(disp, app_data); _drawButtons(disp, app_data);
if (app_data->isButtonBlink) if (app_data->button_blink)
_blinkButtons(disp, app_data); _blinkButtons(disp, app_data);
} }

View File

@@ -7,15 +7,27 @@
// static uint32_t ad9833_calcFreq(float f); // Calculate AD9833 frequency register from a frequency // static uint32_t ad9833_calcFreq(float f); // Calculate AD9833 frequency register from a frequency
// static uint16_t ad9833_calcPhase(float a); // Calculate AD9833 phase register from phase // static uint16_t ad9833_calcPhase(float a); // Calculate AD9833 phase register from phase
void ad9833_spi_activate(ad9833_handle_t *hfg)
{
// 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);
hfg->hcs->cs_off(hfg->hcs);
}
static void ad9833_transmit16(ad9833_handle_t *hfg, uint16_t data) static void ad9833_transmit16(ad9833_handle_t *hfg, uint16_t data)
{ {
uint8_t data8; uint8_t data8;
HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_RESET); ad9833_spi_activate(hfg);
data8 = (uint8_t)((data >> 8) & 0x00FF); data8 = (uint8_t)((data >> 8) & 0x00FF);
HAL_SPI_Transmit(hfg->hspi, &data8, 1, 1); HAL_SPI_Transmit(hfg->hspi, &data8, 1, HAL_MAX_DELAY);
data8 = (uint8_t)(data & 0x00FF); data8 = (uint8_t)(data & 0x00FF);
HAL_SPI_Transmit(hfg->hspi, &data8, 1, 1); HAL_SPI_Transmit(hfg->hspi, &data8, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_SET); ad9833_spi_deactivate(hfg);
} }
void ad9833_reset(ad9833_handle_t *hfg, uint8_t hold) void ad9833_reset(ad9833_handle_t *hfg, uint8_t hold)
@@ -31,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 // Initialise the AD9833 and then set up safe values for the AD9833 device
// Procedure from Figure 27 of in the AD9833 Data Sheet // Procedure from Figure 27 of in the AD9833 Data Sheet
{ {
// initialise our preferred CS pin (could be same as SS) // initialise our preferred CS pin (could be same as SS)
hfg->hspi = hspi; hfg->hspi = hspi;
hfg->cs_port = cs_port; hfg->hcs = hcs;
hfg->cs_pin = cs_pin;
HAL_GPIO_WritePin(hfg->cs_port, hfg->cs_pin, GPIO_PIN_SET); hfg->hcs->cs_off(hfg->hcs);
hfg->_regCtl = 0; hfg->_regCtl = 0;
hfg->_regCtl |= (1 << AD_B28); // always write 2 words consecutively for frequency hfg->_regCtl |= (1 << AD_B28); // always write 2 words consecutively for frequency
@@ -171,8 +182,6 @@ void ad9833_setFrequency(ad9833_handle_t *hfg, AD_channel_t chan, uint32_t freq)
// PRINT("\nsetFreq CHAN_", chan); // PRINT("\nsetFreq CHAN_", chan);
uint16_t freq_channel = 0; uint16_t freq_channel = 0;
hfg->_freq[chan] = freq;
hfg->_regFreq[chan] = ad9833_calcFreq_uint(freq); hfg->_regFreq[chan] = ad9833_calcFreq_uint(freq);
// select the address mask // select the address mask
@@ -205,7 +214,6 @@ void ad9833_setPhase(ad9833_handle_t *hfg, AD_channel_t chan, uint16_t phase)
// PRINT("\nsetPhase CHAN_", chan); // PRINT("\nsetPhase CHAN_", chan);
uint16_t phase_channel = 0; uint16_t phase_channel = 0;
hfg->_phase[chan] = phase;
hfg->_regPhase[chan] = ad9833_calcPhase_uint(phase); hfg->_regPhase[chan] = ad9833_calcPhase_uint(phase);
// select the address mask // select the address mask

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include "spi_cs_if.h"
#define AD_DEFAULT_FREQ 1000U ///< Default initialisation frequency (Hz) #define AD_DEFAULT_FREQ 1000U ///< Default initialisation frequency (Hz)
#define AD_DEFAULT_PHASE 0 ///< Default initialisation phase angle (degrees) #define AD_DEFAULT_PHASE 0 ///< Default initialisation phase angle (degrees)
#define AD_MCLK 25000000U ///< Clock speed of the AD9833 reference clock in Hz #define AD_MCLK 25000000U ///< Clock speed of the AD9833 reference clock in Hz
@@ -37,16 +39,15 @@ typedef struct
uint32_t _regFreq[2]; // frequency registers uint32_t _regFreq[2]; // frequency registers
uint32_t _regPhase[2]; // phase registers uint32_t _regPhase[2]; // phase registers
AD_mode_t _mode; // last set mode AD_mode_t _mode; // last set mode
float _freq[2]; // last frequencies set
uint16_t _phase[2]; // last phase setting
SPI_HandleTypeDef *hspi; SPI_HandleTypeDef *hspi;
GPIO_TypeDef *cs_port; cs_handle_t *hcs;
uint16_t cs_pin;
} ad9833_handle_t; } 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); void ad9833_reset(ad9833_handle_t *hfg, uint8_t hold);
void ad9833_setActiveChannelFreq(ad9833_handle_t *hfg, AD_channel_t chan); void ad9833_setActiveChannelFreq(ad9833_handle_t *hfg, AD_channel_t chan);
AD_channel_t ad9833_getActiveChannelFreq(ad9833_handle_t *hfg); AD_channel_t ad9833_getActiveChannelFreq(ad9833_handle_t *hfg);

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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) 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, 1); 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->hspi = hspi;
hpot->cs_port = cs_port; hpot->hcs = hcs;
hpot->cs_pin = cs_pin;
hpot->max_res = res; hpot->max_res = res;
hpot->dir = MCP41X_ATOB; 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) void mcp41x_setValue(mcp41x_handle_t *hpot, uint8_t value)

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include "spi_cs_if.h"
#define MCP41X_C1 5 #define MCP41X_C1 5
#define MCP41X_C0 4 #define MCP41X_C0 4
#define MCP41X_P1 1 #define MCP41X_P1 1
@@ -36,11 +38,10 @@ typedef struct
uint8_t value; uint8_t value;
SPI_HandleTypeDef *hspi; SPI_HandleTypeDef *hspi;
GPIO_TypeDef *cs_port; cs_handle_t *hcs;
uint16_t cs_pin;
} mcp41x_handle_t; } 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_setValue(mcp41x_handle_t *hpot, uint8_t value);
void mcp41x_setVolume(mcp41x_handle_t *hpot, uint8_t volume); void mcp41x_setVolume(mcp41x_handle_t *hpot, uint8_t volume);
uint8_t mcp41x_getVolume(mcp41x_handle_t *hpot); uint8_t mcp41x_getVolume(mcp41x_handle_t *hpot);

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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;
};