Имеется шина 1-Wire (из названия понятно, что она однопроводная, несчитая общего проводника).
Имеется N устройств на этой шине.
Шина должна знать какие устройства на ней есть.
Устройства должны знать на какой шине сидят.
Устройства пользуются функциями-членами шины для выполнения своих задач.
class OneWireDevice;
class OneWire
{
bool addDevice(OneWireDevice *device);
bool removeDevice(OneWireDevice *device);
List<OneWireDevice *> deviceList(); // List - предполагаемый шаблонный контейнерный класс
void foo();
}
class OneWireDevice
{
OneWireDevice(OneWire *awire = 0);
OneWire* wire();
void bar()
{
wire()->foo();
}
}
Особенность 1-Wire:
1) может быть реализована програмным дрыганьем ножки микроконтроллера;
2) может быть реализована через аппаратный UART, т.е. передавая определённый байт
огибающая сигнала будет повторять необходимую форму ипульсов 1-Wire.
3) сам UART можно реализовать программно дрыгая ножку микроконтроллера.
Т.о. возможны следующие схемы реализации 1-Wire:
OneWire(Pin);
OneWire(UART);
OneWire(SoftUART(Pin));
Сейчас у меня сделан абстрактный класс 1-Wire и наследники, реализующие один из 3-х способов.
class OneWire {...};
// -1-
class OneWirePin: public OneWire
{
OneWirePin(Pin *pin);
};
//...
Pin *pin = new Pin();
OneWirePin *wire(pin);
// -2-
class OneWireUart: public OneWire
{
OneWireUart(Uart *uart);
};
//...
Uart *uart = new Uart();
OneWirePin *wire(uart);
// -3-
class OneWireUartPin: public OneWire
{
OneWireUartPin(SoftUart *uart)
};
//...
Pin *pin = new Pin();
SoftUart *uart = new SoftUart(pin);
OneWirePin *wire(uart);
// ======================================
Всё бы хорошо, но наличие виртуальных функций для микроконтроллерного применения - плохо.
это замедляет код и раздувает его из-за vtable. Сначала хотел реализовать OneWire на шаблонах.
Однако споткнулся на том, что класс OneWireDevice должен пользоваться OneWire и, в частности, возвращать OneWire.
т.е. сделать сам OneWire шаблонным не получится, т.к. для метода OneWireDevice::wire() надо будет аргумент шаблона указывать.
Может кому-то подобную иерархию со статическим полиморфизмом доводилось реализовывать?
В идеале хотелось бы получить такой код применения:
// -1-
Pin *pin = new Pin();
OneWire *wire = new OneWire<Pin *>(pin);
// или
Pin pin;
OneWire *wire = new OneWire<Pin>(pin);
// -2-
UART *uart = new Uart();
OneWire *wire = new OneWire<UART *>(uart);
// или
UART uart;
OneWire *wire = new OneWire<UART >(uart );
// -3-
SoftUART *uart = new SoftUART();
OneWire *wire = new OneWire<SoftUART *>(uart);
// или
SoftUART uart;
OneWire *wire = new OneWire<SoftUART>(uart );