From ce8cf629d34fb6229cd80b082c0b20b90faea089 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Sun, 2 Oct 2022 14:55:57 +0100 Subject: [PATCH 01/17] feature: configure mains PWM outputs and zero crossing interrupt. --- Core/Inc/main.h | 2 ++ Core/Inc/stm32f4xx_it.h | 1 + Core/Src/gpio.c | 4 +++ Core/Src/stm32f4xx_it.c | 15 ++++++++++ Core/Src/tim.c | 24 ++++++++++----- Multichannel temperature sensor.ioc | 45 ++++++++++++++++++++--------- 6 files changed, 69 insertions(+), 22 deletions(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 07365e68..ae250a6d 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -59,10 +59,12 @@ void Error_Handler(void); /* Private defines -----------------------------------------------------------*/ #define BUTTON_Pin GPIO_PIN_13 #define BUTTON_GPIO_Port GPIOC +#define BUTTON_EXTI_IRQn EXTI15_10_IRQn #define PWR_EN_Pin GPIO_PIN_14 #define PWR_EN_GPIO_Port GPIOC #define MAINS_ZERO_Pin GPIO_PIN_15 #define MAINS_ZERO_GPIO_Port GPIOC +#define MAINS_ZERO_EXTI_IRQn EXTI15_10_IRQn #define TEMPERATURE_8_Pin GPIO_PIN_0 #define TEMPERATURE_8_GPIO_Port GPIOC #define EVAPORATOR_T_Pin GPIO_PIN_1 diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h index deb0aa40..8eb26977 100644 --- a/Core/Inc/stm32f4xx_it.h +++ b/Core/Inc/stm32f4xx_it.h @@ -57,6 +57,7 @@ void PendSV_Handler(void); void SysTick_Handler(void); void USART1_IRQHandler(void); void USART2_IRQHandler(void); +void EXTI15_10_IRQHandler(void); void DMA2_Stream0_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 0a25f750..efabbbba 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -97,6 +97,10 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(ENABLE_5_GPIO_Port, &GPIO_InitStruct); + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } /* USER CODE BEGIN 2 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 4aae7358..1de72071 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -228,6 +228,21 @@ void USART2_IRQHandler(void) /* USER CODE END USART2_IRQn 1 */ } +/** + * @brief This function handles EXTI line[15:10] interrupts. + */ +void EXTI15_10_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI15_10_IRQn 0 */ + + /* USER CODE END EXTI15_10_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(BUTTON_Pin); + HAL_GPIO_EXTI_IRQHandler(MAINS_ZERO_Pin); + /* USER CODE BEGIN EXTI15_10_IRQn 1 */ + + /* USER CODE END EXTI15_10_IRQn 1 */ +} + /** * @brief This function handles DMA2 stream0 global interrupt. */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 13e2372c..32bb9f80 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -257,9 +257,9 @@ void MX_TIM10_Init(void) /* USER CODE END TIM10_Init 1 */ htim10.Instance = TIM10; - htim10.Init.Prescaler = 0; + htim10.Init.Prescaler = 19999; htim10.Init.CounterMode = TIM_COUNTERMODE_UP; - htim10.Init.Period = 65535; + htim10.Init.Period = 99; htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim10) != HAL_OK) @@ -270,8 +270,12 @@ void MX_TIM10_Init(void) { Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; + if (HAL_TIM_OnePulse_Init(&htim10, TIM_OPMODE_SINGLE) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM2; + sConfigOC.Pulse = 99; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) @@ -298,9 +302,9 @@ void MX_TIM11_Init(void) /* USER CODE END TIM11_Init 1 */ htim11.Instance = TIM11; - htim11.Init.Prescaler = 0; + htim11.Init.Prescaler = 19999; htim11.Init.CounterMode = TIM_COUNTERMODE_UP; - htim11.Init.Period = 65535; + htim11.Init.Period = 99; htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim11.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim11) != HAL_OK) @@ -311,8 +315,12 @@ void MX_TIM11_Init(void) { Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; + if (HAL_TIM_OnePulse_Init(&htim11, TIM_OPMODE_SINGLE) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM2; + sConfigOC.Pulse = 99; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim11, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) diff --git a/Multichannel temperature sensor.ioc b/Multichannel temperature sensor.ioc index 0ac350fe..39e26195 100644 --- a/Multichannel temperature sensor.ioc +++ b/Multichannel temperature sensor.ioc @@ -127,31 +127,34 @@ Mcu.Pin49=PB9 Mcu.Pin5=PC0 Mcu.Pin50=VP_SYS_VS_Systick Mcu.Pin51=VP_TIM10_VS_ClockSourceINT -Mcu.Pin52=VP_TIM11_VS_ClockSourceINT +Mcu.Pin52=VP_TIM10_VS_OPM +Mcu.Pin53=VP_TIM11_VS_ClockSourceINT +Mcu.Pin54=VP_TIM11_VS_OPM Mcu.Pin6=PC1 Mcu.Pin7=PC2 Mcu.Pin8=PC3 Mcu.Pin9=PA0-WKUP -Mcu.PinsNb=53 +Mcu.PinsNb=55 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F411RETx MxCube.Version=6.5.0 MxDb.Version=DB.6.0.50 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DMA2_Stream0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.EXTI15_10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PA0-WKUP.GPIOParameters=GPIO_Label PA0-WKUP.GPIO_Label=TEMPERATURE_1 PA0-WKUP.Locked=true @@ -455,9 +458,10 @@ SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1 SH.S_TIM4_CH1.ConfNb=1 SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2 SH.S_TIM4_CH2.ConfNb=1 +SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 SPI2.CalculateBaudRate=25.0 MBits/s SPI2.Direction=SPI_DIRECTION_2LINES -SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,BaudRatePrescaler SPI2.Mode=SPI_MODE_MASTER SPI2.VirtualNSS=VM_NSSHARD SPI2.VirtualType=VM_MASTER @@ -467,9 +471,18 @@ TIM1.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation4 CH4,Presca TIM1.Period=5000-1 TIM1.Prescaler=2-1 TIM10.Channel=TIM_CHANNEL_1 -TIM10.IPParameters=Channel +TIM10.IPParameters=Channel,Prescaler,Period,OCMode_PWM,Pulse +TIM10.OCMode_PWM=TIM_OCMODE_PWM2 +TIM10.Period=99 +TIM10.Prescaler=19999 +TIM10.Pulse=99 TIM11.Channel=TIM_CHANNEL_1 -TIM11.IPParameters=Channel +TIM11.IPParameters=Channel,Prescaler,Period,OCMode_PWM,OCPolarity_1,Pulse +TIM11.OCMode_PWM=TIM_OCMODE_PWM2 +TIM11.OCPolarity_1=TIM_OCPOLARITY_HIGH +TIM11.Period=99 +TIM11.Prescaler=19999 +TIM11.Pulse=99 TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 @@ -492,7 +505,11 @@ VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT +VP_TIM10_VS_OPM.Mode=OPM_bit +VP_TIM10_VS_OPM.Signal=TIM10_VS_OPM VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT +VP_TIM11_VS_OPM.Mode=OPM_bit +VP_TIM11_VS_OPM.Signal=TIM11_VS_OPM board=custom isbadioc=false From 4cb36016e2ad1409629441190879a4ed094ecb57 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Sun, 2 Oct 2022 17:44:55 +0100 Subject: [PATCH 02/17] feature: change zero-crossing detection to both edges. --- Core/Src/gpio.c | 12 +++++++++--- Multichannel temperature sensor.ioc | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index efabbbba..b701fe9e 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -63,11 +63,11 @@ void MX_GPIO_Init(void) /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(ENABLE_5_GPIO_Port, ENABLE_5_Pin, GPIO_PIN_RESET); - /*Configure GPIO pins : PCPin PCPin */ - GPIO_InitStruct.Pin = BUTTON_Pin|MAINS_ZERO_Pin; + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = BUTTON_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + HAL_GPIO_Init(BUTTON_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PCPin PCPin PCPin PCPin */ GPIO_InitStruct.Pin = PWR_EN_Pin|ENABLE_2_Pin|ENABLE_3_Pin|ENABLE_4_Pin; @@ -76,6 +76,12 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = MAINS_ZERO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(MAINS_ZERO_GPIO_Port, &GPIO_InitStruct); + /*Configure GPIO pins : PBPin PBPin PBPin PBPin */ GPIO_InitStruct.Pin = ENABLE_7_Pin|SPI2_NSS2_Pin|ENABLE_6_Pin|USART1_DE_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; diff --git a/Multichannel temperature sensor.ioc b/Multichannel temperature sensor.ioc index 39e26195..929a497d 100644 --- a/Multichannel temperature sensor.ioc +++ b/Multichannel temperature sensor.ioc @@ -296,8 +296,9 @@ PC14-OSC32_IN.GPIOParameters=GPIO_Label PC14-OSC32_IN.GPIO_Label=PWR_EN PC14-OSC32_IN.Locked=true PC14-OSC32_IN.Signal=GPIO_Output -PC15-OSC32_OUT.GPIOParameters=GPIO_Label +PC15-OSC32_OUT.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI PC15-OSC32_OUT.GPIO_Label=MAINS_ZERO +PC15-OSC32_OUT.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING PC15-OSC32_OUT.Locked=true PC15-OSC32_OUT.Signal=GPXTI15 PC2.GPIOParameters=GPIO_Label From f454477b7614ce9f37d0556caea1cd32e2144274 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Mon, 3 Oct 2022 16:01:50 +0100 Subject: [PATCH 03/17] feature: add mains zero crossing IRQ handler. --- Hardware/CRealHardwareMap.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index 4a16f8bf..1742ddb4 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -167,3 +167,24 @@ void CRealHardwareMap::enableControlPower(bool b_enable) { m_power_enable.set(b_enable); } + +extern "C" +{ + /* GPIO EXTI Callback is called whenever an interrupt event occurs on EXTI + * pins. + * To speed up execution the processing of this interrupt is done directly + * in the callback instead of calling hardware map methods. + */ + void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) + { + if (GPIO_Pin == BUTTON_Pin) + { + // TODO: whatever needs to be called to handle the button press. + } + else if (GPIO_Pin == MAINS_ZERO_Pin) + { + HAL_TIM_OnePulse_Start(&htim10, TIM_CHANNEL_1); + HAL_TIM_OnePulse_Start(&htim11, TIM_CHANNEL_1); + } + } +} From 51d42c59c1c65e57d35ff764fb5432fbcecb2c57 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Mon, 3 Oct 2022 23:17:58 +0100 Subject: [PATCH 04/17] feature: add mains power control commands to hardware map. --- Hardware/CMockHardwareMap.cpp | 6 ++++++ Hardware/CMockHardwareMap.h | 2 ++ Hardware/CRealHardwareMap.cpp | 3 +++ Hardware/CRealHardwareMap.h | 1 + Hardware/IHardwareMap.h | 7 +++++++ 5 files changed, 19 insertions(+) diff --git a/Hardware/CMockHardwareMap.cpp b/Hardware/CMockHardwareMap.cpp index 9d17f32f..6ef885a0 100644 --- a/Hardware/CMockHardwareMap.cpp +++ b/Hardware/CMockHardwareMap.cpp @@ -115,6 +115,12 @@ void CMockHardwareMap::enableControlPower(bool b_enable) mb_power_enable = b_enable; } +void CMockHardwareMap::setMainsPower(uint8_t channel, float power) +{ + // TODO: create appropriate model for mains consumption depending on what + // this controls. +} + void CMockHardwareMap::run() { float total_radiator_flow = 0; diff --git a/Hardware/CMockHardwareMap.h b/Hardware/CMockHardwareMap.h index d280619b..06f23498 100644 --- a/Hardware/CMockHardwareMap.h +++ b/Hardware/CMockHardwareMap.h @@ -34,6 +34,8 @@ class CMockHardwareMap : public IHardwareMap, public CController #endif virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); + virtual void setMainsPower(uint8_t channel, float power); + /* CController methods. */ // etl::string getName() const; // virtual bool tick(uint32_t current_time); diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index 1742ddb4..cffa36b4 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -168,6 +168,9 @@ void CRealHardwareMap::enableControlPower(bool b_enable) m_power_enable.set(b_enable); } +void CRealHardwareMap::setMainsPower(uint8_t channel, float power) +{ +} extern "C" { /* GPIO EXTI Callback is called whenever an interrupt event occurs on EXTI diff --git a/Hardware/CRealHardwareMap.h b/Hardware/CRealHardwareMap.h index 75856b15..bfc13360 100644 --- a/Hardware/CRealHardwareMap.h +++ b/Hardware/CRealHardwareMap.h @@ -40,6 +40,7 @@ class CRealHardwareMap : public IHardwareMap #endif virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); + virtual void setMainsPower(uint8_t channel, float power); private: typedef struct TIMER_INIT_MAP_T diff --git a/Hardware/IHardwareMap.h b/Hardware/IHardwareMap.h index e2675438..00f24b0a 100644 --- a/Hardware/IHardwareMap.h +++ b/Hardware/IHardwareMap.h @@ -117,6 +117,13 @@ class IHardwareMap * @param b_enable Set to true to enable, false to disable. */ virtual void enableControlPower(bool b_enable) = 0; + /** + * @brief Set power of the mains PWM controlled output. + * + * @param channel Number of the channel. + * @param power Value between 0% and 100%. + */ + virtual void setMainsPower(uint8_t channel, float power) = 0; }; #endif /* IHARDWAREMAP_H_ */ From 5fc68a6baa2b61368272bad83307c53f9de0cd85 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Wed, 5 Oct 2022 18:15:09 +0100 Subject: [PATCH 05/17] feature: implement mains power correction. --- Hardware/CRealHardwareMap.cpp | 64 +++++++++++++++++++++++++++++++++++ Hardware/CRealHardwareMap.h | 5 +++ 2 files changed, 69 insertions(+) diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index cffa36b4..f729ffc5 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -33,6 +33,10 @@ #define AD22100_SCALE ((V_REF / 5.0) * (1 / 22.5E-3)) #define AD22100_OFFSET ((V_REF / 5.0) * (-1.375 / 22.5E-3)) +#define MAINS_FREQUENCY 50 // frequency of the mains power supply in [Hz] +#define MAINS_HALF_PERIOD_MS \ + (1000 / MAINS_FREQUENCY) // duration of mains half period in [ms] + const CRealHardwareMap::timer_init_map_t CRealHardwareMap::s_timer_init_map[] = {{&htim1, TIM_CHANNEL_1}, {&htim4, TIM_CHANNEL_1}, @@ -53,6 +57,11 @@ const CRealHardwareMap::gpio_init_map_t CRealHardwareMap::s_gpio_init_map[] = { {PWM_7_GPIO_Port, PWM_7_Pin}, {PWM_8_GPIO_Port, PWM_8_Pin}}; +// correction factors table. Index corresponds to a fraction of half period when +// TRIAC is on. Full half period is 10. +const float CRealHardwareMap::s_mains_correction_table[] = + {0, 2, 9, 22, 40, 60, 78, 91, 98, 100}; + CRealHardwareMap::CRealHardwareMap() : m_adc(&hadc1) { // TODO Auto-generated constructor stub @@ -170,7 +179,62 @@ void CRealHardwareMap::enableControlPower(bool b_enable) void CRealHardwareMap::setMainsPower(uint8_t channel, float power) { + // TODO: + // 1. Sanitise inputs. + // 2. Convert power from percentage to PWM duty cycle. + // 3. Set appropriate Timer CCR. + TIM_HandleTypeDef *p_timer; + switch (channel) + { + case 1: + p_timer = &htim10; + break; + case 2: + p_timer = &htim11; + break; + default: + // Channel is wrong, so bounce out without changing anything. + return; + } + if (power < 0) + { + power = 0; + } + if (power > 100) + { + power = 100; + } + uint32_t timer_ccr = mainsPowerCorrection(power); + p_timer->Instance->CCR1 = timer_ccr; } + +/** + * @brief Correct inherent non-linearity of the mains PWM. + * + * @param power Required power output. Value must be between 0 and 100; + * @return Fraction of half-period that TRIAC should be on. + */ +float CRealHardwareMap::mainsPowerCorrection(float power) +{ + // Sanitise and handle special cases. + if (power <= 0) return 0; + if (power >= 100) return 1; + uint32_t index = 0; + float mains_factor; // fraction of half-period to switch on + // Find highest power point in the table that's below target power. + while (power > s_mains_correction_table[index]) + { + index++; + } + // Perform linear approximation between this and next power point. + power -= s_mains_correction_table[index]; + mains_factor = power / (s_mains_correction_table[index + 1] - + s_mains_correction_table[index]); + mains_factor += index; + mains_factor /= MAINS_CORRECTION_POINTS; + return mains_factor; +} + extern "C" { /* GPIO EXTI Callback is called whenever an interrupt event occurs on EXTI diff --git a/Hardware/CRealHardwareMap.h b/Hardware/CRealHardwareMap.h index bfc13360..101d145d 100644 --- a/Hardware/CRealHardwareMap.h +++ b/Hardware/CRealHardwareMap.h @@ -22,6 +22,8 @@ # include "CSoftPwmOutput.h" #endif +#define MAINS_CORRECTION_POINTS 10 + class CRealHardwareMap : public IHardwareMap { public: @@ -43,6 +45,8 @@ class CRealHardwareMap : public IHardwareMap virtual void setMainsPower(uint8_t channel, float power); private: + float mainsPowerCorrection(float power) const; + typedef struct TIMER_INIT_MAP_T { TIM_HandleTypeDef *p_timer; @@ -56,6 +60,7 @@ class CRealHardwareMap : public IHardwareMap static const timer_init_map_t s_timer_init_map[HARD_PWM_OUTPUTS]; static const gpio_init_map_t s_gpio_init_map[HARD_PWM_OUTPUTS]; + static const float s_mains_correction_table[MAINS_CORRECTION_POINTS]; CAdcData m_adc; CHardPwmOutput m_hard_pwm_output[HARD_PWM_OUTPUTS]; CGpioWrapper m_polarity_switch[HARD_PWM_OUTPUTS]; From 6063ebe0c861f780c3e771dbb5f6019dfdbe1405 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 16:22:33 +0100 Subject: [PATCH 06/17] feature: add commonly used responses to parent class. --- Lib/Inc/CController.h | 5 +++++ Lib/Src/CController.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Lib/Inc/CController.h b/Lib/Inc/CController.h index e847e627..60b1c008 100644 --- a/Lib/Inc/CController.h +++ b/Lib/Inc/CController.h @@ -37,8 +37,13 @@ class CController virtual uint32_t getRunCalls() const; virtual void resetRunCalls(); #endif + virtual void sendResultMessage(ICommand::command_error_code_t error_code); protected: + // This variable is for generation and storage of temporary messages, e.g. + // command replies. + static etl::string s_scratch_pad; + etl::string const m_name; uint32_t m_run_period_ms; bool mb_stopped; diff --git a/Lib/Src/CController.cpp b/Lib/Src/CController.cpp index 0070d9a9..de18e07f 100644 --- a/Lib/Src/CController.cpp +++ b/Lib/Src/CController.cpp @@ -109,6 +109,33 @@ void CController::start() mb_stopped = false; } +/** + * @brief Send message according to the generated error code. + * + * @param error_code Error code for which the message needs to be generated. + */ +virtual void CController::sendResultMessage( + ICommand::command_error_code_t error_code) +{ + switch (error_code) + { + case ICommand::COMMAND_OK: + // p_comchannel->send("OK.\n"); + break; + case ICommand::ERROR_ARG_COUNT: + p_comchannel->send("Wrong number of arguments.\n"); + break; + case ICommand::ERROR_OUT_OF_BOUNDS: + p_comchannel->send("Argument out of bounds.\n"); + break; + case ICommand::ERROR_TYPE_MISMATCH: + p_comchannel->send("Argument type mismatch.\n"); + break; + default: + p_comchannel->send("Non-specific error with the command."); + } +} + #ifdef COLLECT_STATS /** * @brief Get number of calls to run() method. From 61a59c46e182e0e2b7e956e58a28260f2ce03452 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 16:23:35 +0100 Subject: [PATCH 07/17] refactor (CTemperatureController): use newly created parent class method. --- Controllers/CTemperatureController.cpp | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/Controllers/CTemperatureController.cpp b/Controllers/CTemperatureController.cpp index 1fd39c4d..ab387477 100644 --- a/Controllers/CTemperatureController.cpp +++ b/Controllers/CTemperatureController.cpp @@ -109,23 +109,7 @@ bool CTemperatureController::newCommand(ICommand *p_command, } if (b_command_recognised) { - switch (result) - { - case ICommand::COMMAND_OK: - // p_comchannel->send("OK.\n"); - break; - case ICommand::ERROR_ARG_COUNT: - p_comchannel->send("Wrong number of arguments.\n"); - break; - case ICommand::ERROR_OUT_OF_BOUNDS: - p_comchannel->send("Argument out of bounds.\n"); - break; - case ICommand::ERROR_TYPE_MISMATCH: - p_comchannel->send("Argument type mismatch.\n"); - break; - default: - p_comchannel->send("Non-specific error with the command."); - } + sendResultMessage(result); } return b_command_recognised; } From 70ab2da537049105e6cfca2d19296cbb5d691120 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 16:41:22 +0100 Subject: [PATCH 08/17] feature (CDebugController): add hardware map to debug controller --- Controllers/CDebugController.cpp | 7 +++++-- Controllers/CDebugController.h | 6 +++++- Lib/Src/cpp_link.cpp | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index e226d620..72d74c15 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -11,10 +11,13 @@ #include "CDebugController.h" -CDebugController::CDebugController(etl::string name, +CDebugController::CDebugController(IHardwareMap *p_hardware_map, + etl::string name, uint32_t run_period_ms) : CController(name, run_period_ms), - m_breather_light(BREATHING_GPIO_Port, BREATHING_Pin) + mp_hw(p_hardware_map), + m_breather_light(BREATHING_GPIO_Port, + BREATHING_Pin) // TODO: convert this to HW map call { // TODO Auto-generated constructor stub } diff --git a/Controllers/CDebugController.h b/Controllers/CDebugController.h index 31983221..82dca22d 100644 --- a/Controllers/CDebugController.h +++ b/Controllers/CDebugController.h @@ -15,12 +15,15 @@ #include "../etl/string.h" #include "CController.h" #include "CGpioWrapper.h" +#include "IHardwareMap.h" #include "main.h" class CDebugController : public CController { public: - CDebugController(etl::string name, uint32_t run_period_ms); + CDebugController(IHardwareMap *p_hardware_map, + etl::string name, + uint32_t run_period_ms); virtual ~CDebugController(); virtual void run(); @@ -29,6 +32,7 @@ class CDebugController : public CController private: CGpioWrapper m_breather_light; + IHardwareMap *mp_hw; }; #endif /* CDEBUGCONTROLLER_H_ */ diff --git a/Lib/Src/cpp_link.cpp b/Lib/Src/cpp_link.cpp index 249f6692..a2bc5737 100644 --- a/Lib/Src/cpp_link.cpp +++ b/Lib/Src/cpp_link.cpp @@ -56,7 +56,7 @@ CRealHardwareMap g_hardware_map; * unlikely to cause any issues with clock starvation. For choices of prime * numbers to use see prime_numbers.txt file. */ -CDebugController g_debug_controller("debug", 97); +CDebugController g_debug_controller(&g_hardware_map, "debug", 97); CTemperatureController g_temp_controller(&g_hardware_map, "temperature", 89); #ifdef __cplusplus From f4ce23e495e1d4bd968a3f67acf1e1c9c0953671 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 17:15:59 +0100 Subject: [PATCH 09/17] fix (CRealHardwareMap): missing qualifier for method. --- Hardware/CRealHardwareMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index f729ffc5..963b4055 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -214,7 +214,7 @@ void CRealHardwareMap::setMainsPower(uint8_t channel, float power) * @param power Required power output. Value must be between 0 and 100; * @return Fraction of half-period that TRIAC should be on. */ -float CRealHardwareMap::mainsPowerCorrection(float power) +float CRealHardwareMap::mainsPowerCorrection(float power) const { // Sanitise and handle special cases. if (power <= 0) return 0; From a8a2817844e53758084f0b5120ea027bbe017e50 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 17:25:16 +0100 Subject: [PATCH 10/17] refactor (Hardware maps): to reduce confusion with method names. --- Hardware/CRealHardwareMap.cpp | 2 +- Hardware/CRealHardwareMap.h | 2 +- Hardware/IHardwareMap.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index 963b4055..c0fd4ad2 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -177,7 +177,7 @@ void CRealHardwareMap::enableControlPower(bool b_enable) m_power_enable.set(b_enable); } -void CRealHardwareMap::setMainsPower(uint8_t channel, float power) +void CRealHardwareMap::setMainsPwm(uint8_t channel, float power) { // TODO: // 1. Sanitise inputs. diff --git a/Hardware/CRealHardwareMap.h b/Hardware/CRealHardwareMap.h index 101d145d..cd8835d6 100644 --- a/Hardware/CRealHardwareMap.h +++ b/Hardware/CRealHardwareMap.h @@ -42,7 +42,7 @@ class CRealHardwareMap : public IHardwareMap #endif virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); - virtual void setMainsPower(uint8_t channel, float power); + virtual void setMainsPwm(uint8_t channel, float power); private: float mainsPowerCorrection(float power) const; diff --git a/Hardware/IHardwareMap.h b/Hardware/IHardwareMap.h index 00f24b0a..3c939e94 100644 --- a/Hardware/IHardwareMap.h +++ b/Hardware/IHardwareMap.h @@ -19,7 +19,7 @@ /** * @note Declare this value to the number of soft PWM outputs that are needed. */ -//#define SOFT_PWM_OUTPUTS 0 +// #define SOFT_PWM_OUTPUTS 0 class IHardwareMap { @@ -123,7 +123,7 @@ class IHardwareMap * @param channel Number of the channel. * @param power Value between 0% and 100%. */ - virtual void setMainsPower(uint8_t channel, float power) = 0; + virtual void setMainsPwm(uint8_t channel, float power) = 0; }; #endif /* IHARDWAREMAP_H_ */ From 7b57b542fd73a182231573f89a972f3015a852b4 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 17:26:04 +0100 Subject: [PATCH 11/17] fix: bug in method call --- Controllers/CTemperatureController.cpp | 2 +- Lib/Inc/CController.h | 3 ++- Lib/Src/CController.cpp | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Controllers/CTemperatureController.cpp b/Controllers/CTemperatureController.cpp index ab387477..b4388d17 100644 --- a/Controllers/CTemperatureController.cpp +++ b/Controllers/CTemperatureController.cpp @@ -109,7 +109,7 @@ bool CTemperatureController::newCommand(ICommand *p_command, } if (b_command_recognised) { - sendResultMessage(result); + sendResultMessage(result, p_comchannel); } return b_command_recognised; } diff --git a/Lib/Inc/CController.h b/Lib/Inc/CController.h index 60b1c008..1d93145e 100644 --- a/Lib/Inc/CController.h +++ b/Lib/Inc/CController.h @@ -37,7 +37,8 @@ class CController virtual uint32_t getRunCalls() const; virtual void resetRunCalls(); #endif - virtual void sendResultMessage(ICommand::command_error_code_t error_code); + virtual void sendResultMessage(ICommand::command_error_code_t error_code, + IComChannel *p_comchannel); protected: // This variable is for generation and storage of temporary messages, e.g. diff --git a/Lib/Src/CController.cpp b/Lib/Src/CController.cpp index de18e07f..9ae0aeb5 100644 --- a/Lib/Src/CController.cpp +++ b/Lib/Src/CController.cpp @@ -114,8 +114,8 @@ void CController::start() * * @param error_code Error code for which the message needs to be generated. */ -virtual void CController::sendResultMessage( - ICommand::command_error_code_t error_code) +void CController::sendResultMessage(ICommand::command_error_code_t error_code, + IComChannel *p_comchannel) { switch (error_code) { From 4c265fb4226992bbec56e819decf1ac5190b3dab Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Tue, 11 Oct 2022 17:26:51 +0100 Subject: [PATCH 12/17] feature (CDebugController): add debug API command to control mains PWM. --- Controllers/CDebugController.cpp | 60 ++++++++++++++++++++++++++++++-- Controllers/CDebugController.h | 4 ++- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index 72d74c15..de4720fc 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -35,8 +35,64 @@ void CDebugController::run() bool CDebugController::newCommand(ICommand *p_command, IComChannel *p_comchannel) { - return CController::newCommand(p_command, - p_comchannel); // todo: temporary plug + bool b_command_recognised = false; + ICommand::command_error_code_t error_code; + /** + * Set mains power output. + * + * mains(channel, power); + */ + if (p_command->getName()->compare("mains") == 0) + { + error_code = setMainsPower(p_command); + b_command_recognised = true; + } + else if (p_command->getName()->compare("?mains") == 0) + { + } + if (b_command_recognised) + { + sendResultMessage(error_code, p_comchannel); + } + return (b_command_recognised); } void CDebugController::reset() {} + +ICommand::command_error_code_t CDebugController::setMainsPower( + ICommand *p_command) +{ + uint8_t mains_channel; + float mains_power; + // extract arguments from command. + if (p_command->getArgumentCount() == 1) + { + mains_channel = 0; + mains_power = (*p_command)[0]; + } + else if (p_command->getArgumentCount() == 2) + { + mains_channel = (uint8_t)(*p_command)[0]; + if (mains_channel != (*p_command)[0]) + { + return (ICommand::ERROR_TYPE_MISMATCH); + } + mains_power = (*p_command)[1]; + } + // range check arguments. + if ((mains_channel > 2) || (mains_power < 0) || (mains_power > 100)) + { + return (ICommand::ERROR_OUT_OF_BOUNDS); + } + // set channels to requested power + if (mains_channel) + { + mp_hw->setMainsPwm(mains_channel, mains_power); + } + else + { + mp_hw->setMainsPwm(1, mains_power); + mp_hw->setMainsPwm(2, mains_power); + } + return (ICommand::COMMAND_OK); +} diff --git a/Controllers/CDebugController.h b/Controllers/CDebugController.h index 82dca22d..5beb9191 100644 --- a/Controllers/CDebugController.h +++ b/Controllers/CDebugController.h @@ -31,8 +31,10 @@ class CDebugController : public CController virtual void reset(); private: - CGpioWrapper m_breather_light; + ICommand::command_error_code_t setMainsPower(ICommand *p_command); + IHardwareMap *mp_hw; + CGpioWrapper m_breather_light; }; #endif /* CDEBUGCONTROLLER_H_ */ From 31bb42253a841c412dca51ff979e2ad774393f5d Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Wed, 12 Oct 2022 17:48:17 +0100 Subject: [PATCH 13/17] feature: add getter method for mains PWM power. --- Hardware/CMockHardwareMap.cpp | 37 ++++++++++++++++++++++++++++++++--- Hardware/CMockHardwareMap.h | 4 +++- Hardware/CRealHardwareMap.cpp | 32 ++++++++++++++++++++++++------ Hardware/CRealHardwareMap.h | 1 + Hardware/IHardwareMap.h | 7 +++++++ 5 files changed, 71 insertions(+), 10 deletions(-) diff --git a/Hardware/CMockHardwareMap.cpp b/Hardware/CMockHardwareMap.cpp index 6ef885a0..247dbcda 100644 --- a/Hardware/CMockHardwareMap.cpp +++ b/Hardware/CMockHardwareMap.cpp @@ -115,10 +115,41 @@ void CMockHardwareMap::enableControlPower(bool b_enable) mb_power_enable = b_enable; } -void CMockHardwareMap::setMainsPower(uint8_t channel, float power) +void CMockHardwareMap::setMainsPwm(uint8_t channel, float power) { - // TODO: create appropriate model for mains consumption depending on what - // this controls. + if (power < 0) + { + power = 0; + } + if (power > 100) + { + power = 100; + } + if (channel > 2) + { + return; + } + else if (channel == 0) + { + m_mains_pwm[0] = power; + m_mains_pwm[1] = power; + } + else + { + m_mains_pwm[channel - 1] = power; + } +} + +float CMockHardwareMap::getMainsPwm(uint8_t channel) +{ + if (channel > 2) + { + return 0; + } + else + { + return (m_mains_pwm[channel - 1]); + } } void CMockHardwareMap::run() diff --git a/Hardware/CMockHardwareMap.h b/Hardware/CMockHardwareMap.h index 06f23498..9f9fd7d8 100644 --- a/Hardware/CMockHardwareMap.h +++ b/Hardware/CMockHardwareMap.h @@ -34,7 +34,8 @@ class CMockHardwareMap : public IHardwareMap, public CController #endif virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); - virtual void setMainsPower(uint8_t channel, float power); + virtual void setMainsPwm(uint8_t channel, float power); + virtual float getMainsPwm(uint8_t channel); /* CController methods. */ // etl::string getName() const; @@ -67,6 +68,7 @@ class CMockHardwareMap : public IHardwareMap, public CController float m_incubator_capacity; // heat capacity of incubator float m_incubator_loss; // rate of heat loss to ambient air. float m_control_current; // total current flowing through the heaters. + float m_mains_pwm[2]; }; #endif /* CMOCKHARDWAREMAP_H_ */ diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index c0fd4ad2..9cd9deb8 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -204,8 +204,28 @@ void CRealHardwareMap::setMainsPwm(uint8_t channel, float power) { power = 100; } - uint32_t timer_ccr = mainsPowerCorrection(power); - p_timer->Instance->CCR1 = timer_ccr; + uint16_t ccr = p_timer->Instance->ARR * mainsPowerCorrection(power) / 100; + p_timer->Instance->CCR1 = ccr; +} + +float CRealHardwareMap::getMainsPwm(uint8_t channel) +{ + TIM_HandleTypeDef *p_timer; + switch (channel) + { + case 1: + p_timer = &htim10; + break; + case 2: + p_timer = &htim11; + break; + default: + // Channel is wrong, so bounce out without changing anything. + return 0; + } + float power; + power = p_timer->Instance->CCR1 * 100 / p_timer->Instance->ARR; + return power; } /** @@ -237,10 +257,10 @@ float CRealHardwareMap::mainsPowerCorrection(float power) const extern "C" { - /* GPIO EXTI Callback is called whenever an interrupt event occurs on EXTI - * pins. - * To speed up execution the processing of this interrupt is done directly - * in the callback instead of calling hardware map methods. + /* GPIO EXTI Callback is called whenever an interrupt event occurs on + * EXTI pins. To speed up execution the processing of this interrupt is + * done directly in the callback instead of calling hardware map + * methods. */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { diff --git a/Hardware/CRealHardwareMap.h b/Hardware/CRealHardwareMap.h index cd8835d6..fa8ae8ae 100644 --- a/Hardware/CRealHardwareMap.h +++ b/Hardware/CRealHardwareMap.h @@ -43,6 +43,7 @@ class CRealHardwareMap : public IHardwareMap virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); virtual void setMainsPwm(uint8_t channel, float power); + virtual float getMainsPwm(uint8_t channel); private: float mainsPowerCorrection(float power) const; diff --git a/Hardware/IHardwareMap.h b/Hardware/IHardwareMap.h index 3c939e94..3d34736b 100644 --- a/Hardware/IHardwareMap.h +++ b/Hardware/IHardwareMap.h @@ -124,6 +124,13 @@ class IHardwareMap * @param power Value between 0% and 100%. */ virtual void setMainsPwm(uint8_t channel, float power) = 0; + /** + * @brief Get power of the mains PWM controlled output. + * + * @param channel Number of the channel. + * @return PWM power in percentage of duty cycle. + */ + virtual float getMainsPwm(uint8_t channel) = 0; }; #endif /* IHARDWAREMAP_H_ */ From e1e2383a93252e38b9e4e4f59cc7d95db1af3d4f Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Wed, 12 Oct 2022 18:43:10 +0100 Subject: [PATCH 14/17] feature (CDebugController): add command to query mains power. --- Controllers/CDebugController.cpp | 39 ++++++++++++++++++++++++++++++++ Controllers/CDebugController.h | 4 ++++ Lib/Src/CController.cpp | 2 ++ 3 files changed, 45 insertions(+) diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index de4720fc..a7ac603d 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -10,6 +10,7 @@ */ #include "CDebugController.h" +#include "../etl/to_string.h" CDebugController::CDebugController(IHardwareMap *p_hardware_map, etl::string name, @@ -49,6 +50,23 @@ bool CDebugController::newCommand(ICommand *p_command, } else if (p_command->getName()->compare("?mains") == 0) { + float mains_power; + error_code = getMainsPower(p_command, &mains_power); + if (error_code == ICommand::COMMAND_OK) + { + CController::s_scratch_pad = "Mains channel "; + etl::to_string((*p_command)[0], + CController::s_scratch_pad, + etl::format_spec(), + true); + CController::s_scratch_pad += ": "; + etl::to_string(mains_power, + CController::s_scratch_pad, + etl::format_spec().precision(2), + true); + p_comchannel->send(CController::s_scratch_pad); + } + b_command_recognised = true; } if (b_command_recognised) { @@ -96,3 +114,24 @@ ICommand::command_error_code_t CDebugController::setMainsPower( } return (ICommand::COMMAND_OK); } + +ICommand::command_error_code_t CDebugController::getMainsPower( + ICommand *p_command, + float *power) +{ + *power = 0; + if (p_command->getArgumentCount() != 1) + { + return (ICommand::ERROR_ARG_COUNT); + } + else if (((*p_command)[0] != 1) && ((*p_command)[0] != 2)) + { + return (ICommand::ERROR_OUT_OF_BOUNDS); + } + else + { + uint8_t channel = (*p_command)[0]; + *power = m_mains_power[channel]; + } + return (ICommand::COMMAND_OK); +} diff --git a/Controllers/CDebugController.h b/Controllers/CDebugController.h index 5beb9191..f3a5d71f 100644 --- a/Controllers/CDebugController.h +++ b/Controllers/CDebugController.h @@ -33,8 +33,12 @@ class CDebugController : public CController private: ICommand::command_error_code_t setMainsPower(ICommand *p_command); + ICommand::command_error_code_t getMainsPower(ICommand *p_command, + float *power); + IHardwareMap *mp_hw; CGpioWrapper m_breather_light; + float m_mains_power[2]; }; #endif /* CDEBUGCONTROLLER_H_ */ diff --git a/Lib/Src/CController.cpp b/Lib/Src/CController.cpp index 9ae0aeb5..6fcfb9fe 100644 --- a/Lib/Src/CController.cpp +++ b/Lib/Src/CController.cpp @@ -12,6 +12,8 @@ #include "CController.h" +etl::string CController::s_scratch_pad = ""; + /** * @brief Create controller base class. * From 95c2189be947803cb2aeba8eb276683f2a7c2590 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Thu, 13 Oct 2022 13:44:27 +0100 Subject: [PATCH 15/17] refactor (CDebugController): to use hardware map for breathing light --- Controllers/CDebugController.cpp | 30 +++++++++++++++--------------- Controllers/CDebugController.h | 1 - 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index a7ac603d..e89429a0 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -16,9 +16,7 @@ CDebugController::CDebugController(IHardwareMap *p_hardware_map, etl::string name, uint32_t run_period_ms) : CController(name, run_period_ms), - mp_hw(p_hardware_map), - m_breather_light(BREATHING_GPIO_Port, - BREATHING_Pin) // TODO: convert this to HW map call + mp_hw(p_hardware_map) { // TODO Auto-generated constructor stub } @@ -30,7 +28,9 @@ CDebugController::~CDebugController() void CDebugController::run() { - m_breather_light.toggle(); + static float breathing_light_intensity = 0; + mp_hw->setBreathingLight(breathing_light_intensity); + breathing_light_intensity = breathing_light_intensity ? 0 : 100; } bool CDebugController::newCommand(ICommand *p_command, @@ -54,17 +54,17 @@ bool CDebugController::newCommand(ICommand *p_command, error_code = getMainsPower(p_command, &mains_power); if (error_code == ICommand::COMMAND_OK) { - CController::s_scratch_pad = "Mains channel "; - etl::to_string((*p_command)[0], - CController::s_scratch_pad, - etl::format_spec(), - true); - CController::s_scratch_pad += ": "; - etl::to_string(mains_power, - CController::s_scratch_pad, - etl::format_spec().precision(2), - true); - p_comchannel->send(CController::s_scratch_pad); + CController::s_scratch_pad = "Mains channel "; + etl::to_string((*p_command)[0], + CController::s_scratch_pad, + etl::format_spec(), + true); + CController::s_scratch_pad += ": "; + etl::to_string(mains_power, + CController::s_scratch_pad, + etl::format_spec().precision(2), + true); + p_comchannel->send(CController::s_scratch_pad); } b_command_recognised = true; } diff --git a/Controllers/CDebugController.h b/Controllers/CDebugController.h index f3a5d71f..e876e8ee 100644 --- a/Controllers/CDebugController.h +++ b/Controllers/CDebugController.h @@ -37,7 +37,6 @@ class CDebugController : public CController float *power); IHardwareMap *mp_hw; - CGpioWrapper m_breather_light; float m_mains_power[2]; }; From 5bf67a0e507635101f4cc0f0f29cf0320d3353f5 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Fri, 14 Oct 2022 14:13:01 +0100 Subject: [PATCH 16/17] fix (CDebugController): review issues. --- Controllers/CDebugController.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index e89429a0..bb8d6fe9 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -18,7 +18,10 @@ CDebugController::CDebugController(IHardwareMap *p_hardware_map, : CController(name, run_period_ms), mp_hw(p_hardware_map) { - // TODO Auto-generated constructor stub + if (mp_hw == nullprt) + { + Error_Handler(); + } } CDebugController::~CDebugController() @@ -97,6 +100,10 @@ ICommand::command_error_code_t CDebugController::setMainsPower( } mains_power = (*p_command)[1]; } + else + { + return (ICommand::ERROR_ARG_COUNT); + } // range check arguments. if ((mains_channel > 2) || (mains_power < 0) || (mains_power > 100)) { From 12cd7e078de4f0a7a0b49b4828f4c7b15acaf287 Mon Sep 17 00:00:00 2001 From: Salavat Magazov Date: Fri, 14 Oct 2022 14:14:20 +0100 Subject: [PATCH 17/17] fix: typo. --- Controllers/CDebugController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index bb8d6fe9..e5057fcf 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -18,7 +18,7 @@ CDebugController::CDebugController(IHardwareMap *p_hardware_map, : CController(name, run_period_ms), mp_hw(p_hardware_map) { - if (mp_hw == nullprt) + if (mp_hw == nullptr) { Error_Handler(); }