I have been developing a set of software drivers for the peripherals of a MCU. I need to implement those drivers in the C++ programming language. My idea was to model each driver by its own class.
Interface of a driver for the Peripheral01:
#include "HalCfg.h" class Periph01 { public: Periph01(HalCfg*); Periph01(const Periph01& orig); virtual ~Periph01(); void init(); int getCfg(); private: HalCfg *m_halCfg; int m_cfg; }; Implementation of a driver for the Peripheral01:
#include "Periph01.h" Periph01::Periph01(HalCfg *halCfg) { m_halCfg = halCfg; } Periph01::Periph01(const Periph01& orig) { } Periph01::~Periph01() { } void Periph01::init() { m_cfg = m_halCfg->periph01Cfg.cfg; } int Periph01::getCfg() { return m_cfg; } Each driver will have its configuration
struct Periph01Cfg { int cfg; }; Configuration of all the drivers will be aggregated at one place
#include "Periph01Cfg.h" struct HalCfg { Periph01Cfg periph01Cfg; }; The usage will be following
int main(int argc, char** argv) { HalCfg halCfg; halCfg.periph01Cfg.cfg = 255; Periph01 periph01 = Periph01(&halCfg); periph01.init(); cout << "Peripheral_01 configuration: " << periph01.getCfg() << endl; return 0; } The weakness of this solution is that I need to define a HalCfg type variable and then fill the configuration of all the peripherals at run time. From my point of view it would be better if I can fill the configuration of all the peripherals at compile time at one place in the software. Does anybody have any idea how to do that? Thanks in advance.
UPDATE:
I have probably find a solution based on the so called in-class initialization:
Configuration of all the drivers will be aggregated at one place
#include "Periph01Cfg.h" struct HalCfg { Periph01Cfg periph01Cfg = {255}; }; The usage will be following
int main(int argc, char** argv) { HalCfg halCfg; Periph01 periph01 = Periph01(&halCfg); periph01.init(); cout << "Peripheral_01 configuration: " << periph01.getCfg() << endl; return 0; }