2020-04-23 20:06:40 +00:00
|
|
|
#pragma once
|
|
|
|
|
2020-04-23 22:38:05 +00:00
|
|
|
#include "../resources.h"
|
2020-05-10 23:08:50 +00:00
|
|
|
#include "stmlib/utils/dsp.h"
|
2020-04-23 20:06:40 +00:00
|
|
|
#include "stm32f0xx_hal_gpio.h"
|
|
|
|
#include <stm32f0xx_hal.h>
|
|
|
|
|
2020-04-23 22:38:05 +00:00
|
|
|
using namespace stereo_mix;
|
2020-05-10 23:08:50 +00:00
|
|
|
using namespace stmlib;
|
2020-04-23 22:38:05 +00:00
|
|
|
|
2020-04-23 20:06:40 +00:00
|
|
|
const uint8_t kNumChannels = 4;
|
|
|
|
|
|
|
|
static const uint16_t kGpioPins[] = { GPIO_PIN_7, GPIO_PIN_15, GPIO_PIN_13, GPIO_PIN_14 };
|
2020-04-26 16:29:22 +00:00
|
|
|
static GPIO_TypeDef* kGpioPorts[] = { GPIOB, GPIOB, GPIOC, GPIOC };
|
2020-04-23 20:06:40 +00:00
|
|
|
|
|
|
|
class Leds {
|
|
|
|
public:
|
|
|
|
Leds()
|
|
|
|
{
|
2020-04-26 16:29:22 +00:00
|
|
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
|
|
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
2020-04-23 20:06:40 +00:00
|
|
|
GPIO_InitTypeDef gpioInit;
|
|
|
|
for (size_t i = 0; i < kNumChannels; i++) {
|
|
|
|
gpioInit.Mode = GPIO_MODE_OUTPUT_PP;
|
|
|
|
gpioInit.Pin = kGpioPins[i];
|
|
|
|
gpioInit.Pull = GPIO_NOPULL;
|
|
|
|
gpioInit.Speed = GPIO_SPEED_FREQ_MEDIUM;
|
|
|
|
HAL_GPIO_Init(kGpioPorts[i], &gpioInit);
|
2020-04-25 16:30:09 +00:00
|
|
|
|
|
|
|
intensities[i] = 0;
|
|
|
|
blinking[i] = false;
|
2020-04-23 20:06:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
void Write()
|
|
|
|
{
|
2020-04-26 23:01:41 +00:00
|
|
|
#ifdef DEBUG_PIN
|
|
|
|
for (size_t i = 0; i < kNumChannels - 1; i++) {
|
|
|
|
#else
|
2020-04-23 20:06:40 +00:00
|
|
|
for (size_t i = 0; i < kNumChannels; i++) {
|
2020-04-26 23:01:41 +00:00
|
|
|
|
|
|
|
#endif
|
2020-04-25 18:23:14 +00:00
|
|
|
bool in_blink_phase = blink_counter > (0x2000 / 2) || !blinking[i];
|
2020-05-10 23:08:50 +00:00
|
|
|
if (intensities[i] && lut_led_gamma[intensities[i] >> 8] >= pwm_counter && in_blink_phase) {
|
2020-04-25 16:30:09 +00:00
|
|
|
kGpioPorts[i]->BSRR |= kGpioPins[i];
|
2020-04-23 20:06:40 +00:00
|
|
|
} else {
|
2020-04-25 16:30:09 +00:00
|
|
|
kGpioPorts[i]->BRR |= kGpioPins[i];
|
2020-04-23 20:06:40 +00:00
|
|
|
}
|
|
|
|
}
|
2020-05-10 23:08:50 +00:00
|
|
|
pwm_counter++;
|
|
|
|
blink_counter++;
|
|
|
|
if(blink_counter > 0x2000) blink_counter = 0;
|
2020-04-23 20:06:40 +00:00
|
|
|
}
|
2020-05-10 23:08:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
void set_intensity(uint8_t channel, uint16_t intensity)
|
2020-04-23 20:06:40 +00:00
|
|
|
{
|
|
|
|
if (channel >= kNumChannels)
|
|
|
|
return;
|
2020-05-10 23:08:50 +00:00
|
|
|
|
2020-04-23 20:06:40 +00:00
|
|
|
intensities[channel] = intensity;
|
|
|
|
}
|
2020-04-25 16:30:09 +00:00
|
|
|
void set_blinking(uint8_t channel, bool blink)
|
|
|
|
{
|
|
|
|
if (channel >= kNumChannels)
|
|
|
|
return;
|
|
|
|
blinking[channel] = blink;
|
|
|
|
}
|
2020-04-23 20:06:40 +00:00
|
|
|
|
|
|
|
private:
|
2020-05-10 23:08:50 +00:00
|
|
|
uint8_t pwm_counter;
|
2020-04-25 16:30:09 +00:00
|
|
|
uint16_t blink_counter;
|
2020-05-10 23:08:50 +00:00
|
|
|
uint16_t intensities[kNumChannels];
|
2020-04-25 16:30:09 +00:00
|
|
|
bool blinking[kNumChannels];
|
2020-04-23 20:06:40 +00:00
|
|
|
};
|