// 記錄下 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());