diff --git a/Inc/ST-LIB.hpp b/Inc/ST-LIB.hpp index 726e225f..1c6aa106 100644 --- a/Inc/ST-LIB.hpp +++ b/Inc/ST-LIB.hpp @@ -82,19 +82,35 @@ template struct BuildCtx { } }; -using DomainsCtx = BuildCtx< - MPUDomain, - GPIODomain, - TimerDomain, - DMA_Domain, - SPIDomain, - DigitalOutputDomain, - DigitalInputDomain, - MdmaPacketDomain, - SdDomain, - EthernetDomain, - ADCDomain, - EXTIDomain /* PWMDomain, ...*/>; +/* DomainXList params: + * - First param: Domain name + * - Second param: instance name + * - Rest: any dependencies on previous domains + */ +#define DomainXList \ + X_TEMPLATED(MPUDomain, mpu) NEXT \ + X(GPIODomain, gpio) NEXT \ + X(TimerDomain, tim) NEXT \ + X(DMA_Domain, dma) NEXT \ + X(SPIDomain, spi, GPIODomain::Init::instances, DMA_Domain::Init::instances) NEXT \ + X(DigitalOutputDomain, dout, GPIODomain::Init::instances) NEXT \ + X(DigitalInputDomain, din, GPIODomain::Init::instances) NEXT \ + X(MdmaPacketDomain, mdmaPacket, MPUDomain::Init::instances) NEXT \ + X(SdDomain, sd, MPUDomain::Init::instances, DigitalInputDomain::Init::instances) NEXT \ + X(EthernetDomain, eth, DigitalOutputDomain::Init::instances) NEXT \ + X(ADCDomain, adc, GPIODomain::Init::instances) NEXT \ + X(EXTIDomain, exti, GPIODomain::Init::instances) /* NEXT \ + X(...Domain, ..., dependencies here [for init()]) */ + +#define X_TEMPLATED X + +#define NEXT , +#define X(domain, inst, ...) domain + +using DomainsCtx = BuildCtx; + +#undef NEXT +#undef X template struct Board { static consteval auto build_ctx() { @@ -109,75 +125,48 @@ template struct Board { return ctx.template span().size(); } + static consteval auto build() { - constexpr std::size_t mpuN = domain_size(); - constexpr std::size_t gpioN = domain_size(); - constexpr std::size_t timN = domain_size(); - constexpr std::size_t dmaN = domain_size(); - constexpr std::size_t spiN = domain_size(); - constexpr std::size_t doutN = domain_size(); - constexpr std::size_t dinN = domain_size(); - constexpr std::size_t mdmaPacketN = domain_size(); - constexpr std::size_t sdN = domain_size(); - constexpr std::size_t ethN = domain_size(); - constexpr std::size_t adcN = domain_size(); - constexpr std::size_t extiN = domain_size(); - // ... +#define NEXT ; +#define X(domain, inst, ...) \ + constexpr std::size_t inst##N = domain_size(); + + DomainXList; + +#undef X struct ConfigBundle { - std::array mpu_cfgs; - std::array gpio_cfgs; - std::array tim_cfgs; - std::array dma_cfgs; - std::array spi_cfgs; - std::array dout_cfgs; - std::array din_cfgs; - std::array mdma_packet_cfgs; - std::array sd_cfgs; - std::array eth_cfgs; - std::array adc_cfgs; - std::array exti_cfgs; - // ... +#define X(domain, inst, ...) \ + std::array inst##_cfgs + + DomainXList; + +#undef NEXT +#undef X }; return ConfigBundle{ - .mpu_cfgs = MPUDomain::template build(ctx.template span()), - .gpio_cfgs = GPIODomain::template build(ctx.template span()), - .tim_cfgs = TimerDomain::template build(ctx.template span()), - .dma_cfgs = DMA_Domain::template build(ctx.template span()), - .spi_cfgs = SPIDomain::template build(ctx.template span()), - .dout_cfgs = - DigitalOutputDomain::template build(ctx.template span() - ), - .din_cfgs = - DigitalInputDomain::template build(ctx.template span()), - .mdma_packet_cfgs = - MdmaPacketDomain::template build(ctx.template span() - ), - .sd_cfgs = SdDomain::template build(ctx.template span()), - .eth_cfgs = EthernetDomain::template build(ctx.template span()), - .adc_cfgs = ADCDomain::template build(ctx.template span()), - .exti_cfgs = EXTIDomain::template build(ctx.template span()), - // ... +#define NEXT , +#define X(domain, inst, ...) \ + .inst##_cfgs = domain::template build(ctx.template span()) + + DomainXList, + +#undef NEXT +#undef X }; } static constexpr auto cfg = build(); static void init() { - constexpr std::size_t mpuN = domain_size(); - constexpr std::size_t gpioN = domain_size(); - constexpr std::size_t timN = domain_size(); - constexpr std::size_t dmaN = domain_size(); - constexpr std::size_t spiN = domain_size(); - constexpr std::size_t doutN = domain_size(); - constexpr std::size_t dinN = domain_size(); - constexpr std::size_t mdmaPacketN = domain_size(); - constexpr std::size_t sdN = domain_size(); - constexpr std::size_t ethN = domain_size(); - constexpr std::size_t adcN = domain_size(); - constexpr std::size_t extiN = domain_size(); - // ... +#define NEXT ; +#define X(domain, inst, ...) \ + constexpr std::size_t inst##N = domain_size(); + + DomainXList; + +#undef X #ifdef HAL_IWDG_MODULE_ENABLED Watchdog::check_reset_flag(); @@ -186,30 +175,18 @@ template struct Board { HALconfig::system_clock(); HALconfig::peripheral_clock(); - MPUDomain::Init::init(); - GPIODomain::Init::init(cfg.gpio_cfgs); - TimerDomain::Init::init(cfg.tim_cfgs); - DMA_Domain::Init::init(cfg.dma_cfgs); - SPIDomain::Init::init( - cfg.spi_cfgs, - GPIODomain::Init::instances, - DMA_Domain::Init::instances - ); - DigitalOutputDomain::Init::init(cfg.dout_cfgs, GPIODomain::Init::instances); - DigitalInputDomain::Init::init(cfg.din_cfgs, GPIODomain::Init::instances); - MdmaPacketDomain::Init::init( - cfg.mdma_packet_cfgs, - MPUDomain::Init::instances - ); - SdDomain::Init::init( - cfg.sd_cfgs, - MPUDomain::Init::instances, - DigitalInputDomain::Init::instances - ); - EthernetDomain::Init::init(cfg.eth_cfgs, DigitalOutputDomain::Init::instances); - ADCDomain::Init::init(cfg.adc_cfgs, GPIODomain::Init::instances); - EXTIDomain::Init::init(cfg.exti_cfgs, - GPIODomain::Init::instances); // ... + +#undef X_TEMPLATED +#define X_TEMPLATED(domain, inst, ...) \ + domain::Init::init(##__VA_ARGS__); +#define X(domain, inst, ...) \ + domain::Init::init(cfg.inst##_cfgs, ##__VA_ARGS__); + + DomainXList; + +#undef NEXT +#undef X_TEMPLATED +#undef X } template