// 记录下 sensor hal 层
ambient_light_module_init 以这个 举例.
这个 是 sensor 的 hal 层的 入口函数
这里的 factory ? 指的 就是 设计模式中的 工厂模式??
register_sensor :注册 sensor
通过register_sensor将type和func放入callbacks的unordered_map中。并将datatype插入到datatypes的unordered_set中,以便后面使用。
暂时 还不知道 get_available_als_sensors 这个 函数会什么时候调用
看下 注释:
这个是 创建 这种功能的函数
static vector<unique_ptr<sensor>> get_available_als_sensors()
{
const vector<sensor_uid>& als_suids =
//1: 获取 suid sensor_factory::instance().get_suids(SSC_DATATYPE_AMBIENT_LIGHT);
vector<unique_ptr<sensor>> sensors;
for (const auto& suid : als_suids) {
// 2: 获取 attributes
const sensor_attributes& attr =
sensor_factory::instance().get_attributes(suid);
/* publish only on-change proximity sensor */
if (attr.get_stream_type() != SNS_STD_SENSOR_STREAM_TYPE_ON_CHANGE) {
continue;
}
try {
// 3: make_unique 智能指针,会调用到 构造函数...
sensors.push_back(make_unique<ambient_light>(suid, SENSOR_WAKEUP));
} catch (const exception& e) {
sns_loge("failed for wakeup, %s", e.what());
}
try {
sensors.push_back(make_unique<ambient_light>(suid, SENSOR_NO_WAKEUP));
} catch (const exception& e) {
sns_loge("failed for nowakeup, %s", e.what());
}
}
return sensors;
}
看下3 的构造函数的实现
ambient_light::ambient_light(sensor_uid suid, sensor_wakeup_type wakeup):
ssc_sensor(suid, wakeup)
{
set_type(SENSOR_TYPE_LIGHT);
set_string_type(SENSOR_STRING_TYPE_LIGHT);
set_sensor_typename("Ambient Light Sensor");
set_nowk_msgid(SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_PHYSICAL_CONFIG_EVENT);
}
class ambient_light : public ssc_sensor
继承了 class ssc_sensor : public sensor
sensor 是 基类…
继续回到
ambient_light 函数
/**
* @brief Adds a message id into the no wakeup message id list
* maintained for the sensor.
* @param msg_id
*/
注册了一个 消息 id set_nowk_msgid(SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_PHYSICAL_CONFIG_EVENT);
// 该command下下去后,会在SLPI侧 driver 中做相应的动作
// tcs3707_send_config_event 中 通过 pb_send_event 传回 client (hal 端 )
一看 , 我曹,没了. 就看完了??
还有个 这个函数
handle_sns_std_sensor_event
对 事件的处理 函数
1: 解析 数据.
pb_sensor_event.ParseFromString(pb_event.payload());