this device ID identifies a specific device via the tuple of (bus, bus
type, address, devtype). This allows device specific configuration
data to be stored along with a device ID, so the code can know when
the user has changed device configuration (such as removing an
external compass), and either invalidate the device configuration or
force the user to re-calibrate
Make the Device destructor public and virtual, so that arbitrary devices can be deleted. Likewise for classes that derive from it.
Make Device::init public so that arbitrary devices can be initialised after being returned by factories.