天天看點

sensor hal

// 記錄下 sensor hal 層

ambient_light_module_init 以這個 舉例.

這個 是 sensor 的 hal 層的 入口函數

sensor hal

這裡的 factory ? 指的 就是 設計模式中的 工廠模式??

register_sensor :注冊 sensor

通過register_sensor将type和func放入callbacks的unordered_map中。并将datatype插入到datatypes的unordered_set中,以便後面使用。

暫時 還不知道 get_available_als_sensors 這個 函數會什麼時候調用

看下 注釋:

sensor hal

這個是 建立 這種功能的函數

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 是 基類…

sensor hal

繼續回到

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());

           

繼續閱讀