diff --git a/Inc/ST-LIB.hpp b/Inc/ST-LIB.hpp index 70f2ae38..c850e826 100644 --- a/Inc/ST-LIB.hpp +++ b/Inc/ST-LIB.hpp @@ -83,11 +83,30 @@ template struct BuildCtx { } }; -using DomainsCtx = BuildCtx; +/* 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(DigitalOutputDomain, dout, GPIODomain::Init::instances) NEXT \ + X(DigitalInputDomain, din, GPIODomain::Init::instances) NEXT \ + X(MdmaPacketDomain, mdmaPacket, MPUDomain::Init::instances) NEXT \ + /* X(ADCDomain, adc) NEXT */ \ + X(SdDomain, sd, MPUDomain::Init::instances, DigitalInputDomain::Init::instances) + +#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() { @@ -102,71 +121,62 @@ 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 doutN = domain_size(); - constexpr std::size_t dinN = domain_size(); - constexpr std::size_t mdmaPacketN = domain_size(); - constexpr std::size_t sdN = domain_size(); - // ... +#define NEXT ; +#define X(domain, inst, ...) \ + constexpr std::size_t inst##N = domain_size(); + + DomainXList; + +#undef NEXT +#undef X struct ConfigBundle { - std::array mpu_cfgs; - std::array gpio_cfgs; - std::array tim_cfgs; - std::array dout_cfgs; - std::array din_cfgs; - std::array mdma_packet_cfgs; - std::array sd_cfgs; - // ... +#define NEXT ; +#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()), - .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()), - // ... +#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 doutN = domain_size(); - constexpr std::size_t dinN = domain_size(); - constexpr std::size_t mdmaPacketN = domain_size(); - constexpr std::size_t sdN = domain_size(); - // ... - - MPUDomain::Init::init(); - GPIODomain::Init::init(cfg.gpio_cfgs); - TimerDomain::Init::init(cfg.tim_cfgs); - 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); - // ... +#define NEXT ; +#define X(domain, inst, ...) \ + constexpr std::size_t inst##N = domain_size(); + + DomainXList; + +#undef X + +#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