classDiagram
%% ================================
%% 驱动工厂 - 单例+工厂方法模式
%% ================================
class IDriverFactory {
<<interface>>
<<factory>>
+set_driver_path(driver_path: string_t&) void
+get_driver(const string_t& driver_name) IDriver&
+get_driver_load_info(void) string_t void
+remove_driver(driver_name: string_t&) void
get_instance()$ IDriverFactory&
}
class driver_factory {
<<singleton>>
<<factory>>
-m_drivers: map~string_t,driver_ptr~
-m_driver_path: string_t
+set_driver_path(driver_path: string_t&) void
+get_driver(const string_t& driver_name) IDriver&
+get_driver_load_info(void) string_t void
+remove_driver(driver_name: string_t&) void
+get_instance()$ driver_factory&
}
%% ================================
%% ABI接口层
%% ================================
class IDriver {
<<interface>>
+driver_name: char*
+init(args: void*) void
+config(config: void*) void
+lock() void
+unlock() void
}
%% ================================
%% ABI接口层 - 驱动抽象类
%% ================================
class Adc {
<<interface>>
+read(index: uint32_t) uint32_t
}
class Bt {
<<interface>>
+read(index: uint32_t, len: uint32_t, timeout: uint32_t) string_t
+write(index: uint32_t, val: string_view&, timeout: uint32_t) void
}
class AdcImpl {
+read() uint32_t
}
class BtImpl {
+read(index: uint32_t, len: uint32_t, timeout: uint32_t) string_t
+write(index: uint32_t, val: string_view&, timeout: uint32_t) void
}
%% ================================
%% 接口实现关系
%% ================================
IDriverFactory <|.. driver_factory : 继承
IDriver <|.. Adc : 继承
IDriver <|.. Bt : 继承
Adc <|.. AdcImpl : 实现
Bt <|.. BtImpl : 实现
%% ================================
%% 组合关系
%% ================================
driver_factory *-- IDriver : 管理
%% ================================
%% 依赖关系
%% ================================
driver_factory --> IDriver : 创建
%% ================================
%% 样式定义
%% ================================
style IDriverFactory fill:#fff3e0
style driver_factory fill:#ff9800
style IDriver fill:#fff3e0
style Adc fill:#fff3e0
style Bt fill:#fff3e0
style AdcImpl fill:#c9f2c7
style BtImpl fill:#c9f2c7
class AdcImpl : Adc {
private:
std::mutex m_mutex;
int32_t m_fd;
public:
AdcImpl(){}
uint32_t read(int32_t index) override;
};
void AdcImpl::init(void *args)
{
m_mutex = new std::mutex;
}
void AdcImpl::config(int32_t index, void *config)
{
AdcConfig *cfg = (AdcConfig *)config;
}
void AdcImpl::lock(int32_t index)
{
m_mutex.lock;
}
void AdcImpl::unlock(int32_t index)
{
m_mutex.unlock;
}
uint32_t AdcImpl::read(int32_t index)
{
uint32_t ret = ioctl(m_fd, ADC_CMD_READ, param)
return ret;
}
Driver* create_driver()
{
AdcImpl *drv = new AdcImpl();
return (Driver*)drv;
}
void destroy_driver(Driver* drv)
{
delete (AdcImpl *)drv;
}