高通see架构ppg测试流程sns_client_test_cpp

浅析高通see架构测试流程,主要从编译方法,以及抓取log ,依据log 分析架构函数实际的初始化应用。

一:抓取的log 分析。
sns_client_test_cpp 命令
vendor\qcom\proprietary\sensors-see\test\sns_client_example\src\sns_client_test.cpp

通过log 来分析流程比较容易一些:

msm8937_32go:/ # sns_client_test_cpp pah813xselftest 7 


pxs-100 sns_client_test.cpp starting sensors test for press ctrl-C to stop pah813xselftest
ssc_enable_rt_task:253, pxs501 ssc_utils.cpp ssc_enable_rt_task: true
ssc_enable_rt_task:255, ssc_enable_rt_task : true
get_atrace_delay_checktime_ms:245, atrace_delay_checktime_ms : 0
qmi_connect:287, pxs421 ssc_connection.cpp waiting for sensors qmi service
qmi_connect:289, pxs421 ssc_connection.cpp connecting to qmi service
qmi_connect:324, pxs421 ssc_connection.cpp connected to ssc for 0xb3132000
ssc_qmi_connection:186, pxs431 ssc_connection.cpp _service_accessed 0
ssc_connection:695, pxs400 ssc_connection.cpp ssc connected


pxs-101 sns_client_test.cpp starting sensors test for request_suid pah813xselftest
request_suid:63, pxs-200 ssc_utils.cpp requesting suid for pah813xselftest, ts = 1446.292969s
send_request:638, pxs411 ssc_connection.cpp  ssc_qmi_connection::send_request 
handle_indication_realtime:356,  SCHED_FIFO(10) for qmi_cbk
handle_indication_realtime:376, msg_id 34 
handle_indication_realtime:438, indication, payload_len=75
handle_ssc_event:102, pxs-202 ssc_utils.cpp  suid_event for pah813xselftest, num_suids=1, ts=1446.296143s


suid_cb:383, pxs-110 sns_client_test.cpp Received SUID event with length 1
ssc_enable_rt_task:253, pxs501 ssc_utils.cpp ssc_enable_rt_task: true
ssc_enable_rt_task:255, ssc_enable_rt_task : true
get_atrace_delay_checktime_ms:245, atrace_delay_checktime_ms : 0
qmi_connect:287, pxs421 ssc_connection.cpp waiting for sensors qmi service
qmi_connect:289, pxs421 ssc_connection.cpp connecting to qmi service
qmi_connect:324, pxs421 ssc_connection.cpp connected to ssc for 0xb3132100
ssc_qmi_connection:186, pxs431 ssc_connection.cpp _service_accessed 0
ssc_connection:695, pxs400 ssc_connection.cpp ssc connected


suid_cb:390, pxs-111 sns_client_test.cpp Received SUID b3d9bda32e90f48b4e5e08c719699b08 for 'pah813xselftest'
suid_cb:396, pxs-113 self test request
send_request:638, pxs411 ssc_connection.cpp  ssc_qmi_connection::send_request 
handle_indication_realtime:356,  SCHED_FIFO(10) for qmi_cbk
handle_indication_realtime:376, msg_id 34 
handle_indication_realtime:438, indication, payload_len=383


event_cb:199, pxs-130 sns_client_test.cpp  Received QMI indication with length 383
event_cb:206, event[0] msg_id=128, ts=28074394019
event_cb:249, attribute ID :2
event_cb:249, attribute ID :4
event_cb:249, attribute ID :3
event_cb:249, attribute ID :6
event_cb:249, attribute ID :0
event_cb:249, attribute ID :1
event_cb:249, attribute ID :5
event_cb:249, attribute ID :7
event_cb:249, attribute ID :9
event_cb:249, attribute ID :10
event_cb:249, attribute ID :11
event_cb:249, attribute ID :12
event_cb:249, attribute ID :13
event_cb:249, attribute ID :14
event_cb:249, attribute ID :15
event_cb:249, attribute ID :16
event_cb:249, attribute ID :21
event_cb:249, attribute ID :22
event_cb:249, attribute ID :23
event_cb:249, attribute ID :24
print_sensor_info:138, --------------------- 
print_sensor_info:139, ##### ATTRIBUTES #### 
print_sensor_info:140, --------------------- 
print_sensor_info:142, SNS_STD_SENSOR_ATTRID_NAME: pah813x_selftest 

print_sensor_info:143, SNS_STD_SENSOR_ATTRID_VENDOR : pixart 

print_sensor_info:144, SNS_STD_SENSOR_ATTRID_TYPE :pah813xselftest 

print_sensor_info:158, max_delay: 1000000 uSec

print_sensor_info:159, min_delay: 1000 uSec

print_sensor_info:168, -----------------------
print_sensor_info:169, supported resolutions: 
print_sensor_info:170, -----------------------
print_sensor_info:172, 1.000000
print_sensor_info:174, -----------------------
print_sensor_info:177, supported ranges: 
print_sensor_info:178, -----------------------
print_sensor_info:180, 2147483648.000000
print_sensor_info:182, -----------------------


suid_cb:400, pxs-114 self test request
send_config_req:336, sending on normal config request and sample rate 7
send_request:638, pxs411 ssc_connection.cpp  ssc_qmi_connection::send_request 
handle_indication_realtime:376, msg_id 34 
handle_indication_realtime:438, indication, payload_len=78
event_cb:199, pxs-130 sns_client_test.cpp  Received QMI indication with length 78
event_cb:206, event[0] msg_id=1025, ts=28136737377
event_cb:228, A4100-9 Received pah813xselftest sample <54.000000, 26.000000, 9.000000, 14.000000, 7.000000, 281.000000, 275.000000, 273.000000, 274.000000>
 

二:代码流程:

sns_client_test_cpp pah813xselftest 7

main函数会把参数   pah813xselftest 赋值给 s_name,把type 值传给 gSamplerate

strlcpy(s_name, argv[1], sizeof(s_name));

gSamplerate = atoi(argv[2]); 

msm8937_32go:/ # sns_client_test_cpp pah813xselftest 7
starting sensors test for press ctrl-C to stop pah813xselftest
执行如上命令,传递参数 pah813xselftest 以及 type 7

1:log第一段分析。

//sns_client_test.cpp
int
main(int argc, char *argv[])
{

  if(argc != 3) {
    cout << "usage sns_client_example_cpp <sensor name> samplerate" << endl;
    cout << "(on change sensors do not honor samplerate but needs samplerate argument for testapp compatibiltiy)" << endl;
    //SNS_PHYSICAL_SENSOR_TEST_MSGID_SNS_PHYSICAL_SENSOR_TEST_CONFIG = 515,
    cout << "(samplerate -1 is considered as SNS_PHYSICAL_SENSOR_TEST_TYPE_SW )" << endl;
    cout << "(samplerate -2 is considered as SNS_PHYSICAL_SENSOR_TEST_TYPE_HW )" << endl;
    cout << "(samplerate -3 is considered as SNS_PHYSICAL_SENSOR_TEST_TYPE_FACTORY )" << endl;
    cout << "(samplerate -4 is considered as SNS_PHYSICAL_SENSOR_TEST_TYPE_COM )" << endl;
    exit(1);
  }

  strlcpy(s_name, argv[1], sizeof(s_name));
  sensors_log::set_tag("sns_client_example");
  sensors_log::set_level(sensors_log::VERBOSE);
  sensors_log::set_stderr_logging(true);

  gSamplerate = atoi(argv[2]);


  cout <<"pxs-100 sns_client_test.cpp starting sensors test for press ctrl-C to stop " << s_name << endl;

  suid_lookup lookup(suid_cb);// 分析 go->01
  
  cout <<"pxs-101 sns_client_test.cpp starting sensors test for request_suid " << s_name << endl;
   
  lookup.request_suid(s_name);// 分析 go->02


  sleep(UINT_MAX);
  // to stop sensor
  delete connection;
  //  no sensor samples after this
  sns_logv("Test completed, closing");

  return 0;
}

pxs-100 sns_client_test.cpp starting sensors test for press ctrl-C to stop pah813xselftest
ssc_enable_rt_task:253, pxs501 ssc_utils.cpp ssc_enable_rt_task: true
ssc_enable_rt_task:255, ssc_enable_rt_task : true
get_atrace_delay_checktime_ms:245, atrace_delay_checktime_ms : 0
qmi_connect:287, pxs421 ssc_connection.cpp waiting for sensors qmi service
qmi_connect:289, pxs421 ssc_connection.cpp connecting to qmi service
qmi_connect:324, pxs421 ssc_connection.cpp connected to ssc for 0xb3132000
ssc_qmi_connection:186, pxs431 ssc_connection.cpp _service_accessed 0
ssc_connection:695, pxs400 ssc_connection.cpp ssc connected

pxs-101 sns_client_test.cpp starting sensors test for request_suid pah813xselftest

//sns_client_test.cpp
//构造函数初始化
suid_lookup lookup(suid_cb);// 分析 go->01


//ssc_utils.cpp
//构造函数,函数名和类名一致,初始化成员变量
suid_lookup::suid_lookup(suid_event_function cb):
    _cb(cb),
    _ssc_conn(get_ssc_event_cb())  //成员变量初始化
{
}

//ssc_utils.h
class suid_lookup
{
public:
    void request_suid(std::string datatype, bool default_only = false);

private:
    suid_event_function _cb;
    void handle_ssc_event(const uint8_t *data, size_t size);

    ssc_connection _ssc_conn;   //pxs->go ,发现又是类和构造函数

    ssc_event_cb get_ssc_event_cb()
    {
        return [this](const uint8_t *data, size_t size)
        {
          handle_ssc_event(data, size);
        };
    }
};


//ssc_connection.cpp
//类的构造函数初始化赋值
/* creates new connection to ssc */
ssc_connection::ssc_connection(ssc_event_cb event_cb) :
    _qmi_conn(make_unique<ssc_qmi_connection>(event_cb)) //go->002
{
    sns_logv("pxs400 ssc_connection.cpp ssc connected"); //pxs->go print log
}

大家可以看到这部分代码,函数内部是最后执行的,而成员变量初始化部分是更早执行的
ssc_qmi_connection:186, pxs431 ssc_connection.cpp _service_accessed 0
ssc_connection:695, pxs400 ssc_connection.cpp ssc connected


所以需要分析一下:
 _qmi_conn(make_unique<ssc_qmi_connection>(event_cb)) 这里优先执行


//ssc_connection.cpp
ssc_qmi_connection::ssc_qmi_connection(ssc_event_cb event_cb) :
    _event_cb(event_cb),
    _reconnecting(false),
    _connection_closed(false)
{

//print log
//ssc_enable_rt_task:253, ssc_enable_rt_task: true
//ssc_enable_rt_task:255, ssc_enable_rt_task : true
    _set_rt_prio = ssc_enable_rt_task(); //pxs-go->001

    _use_rt_cbk = _set_rt_prio;

//print log
//get_atrace_delay_checktime_ms:245, atrace_delay_checktime_ms : 0
    _atrace_delay_checktime_ms = get_atrace_delay_checktime_ms();

    _is_event_cb_ts = false;

    qmi_connect();   //pxs-go->002

//print log
//ssc_qmi_connection:186, _service_accessed 0
    sns_logd("pxs431 ssc_connection.cpp _service_accessed %d", (int)_service_accessed);

    _worker.setname("ssc_qmi_connection");
}
//ssc_connection.cpp
void ssc_qmi_connection::qmi_connect()
{
    qmi_idl_service_object_type svc_obj =
        SNS_CLIENT_SVC_get_service_object_v01();

    qmi_client_error_type qmi_err;
    qmi_service_info svc_info_array[MAX_SVC_INFO_ARRAY_SIZE];
    uint32_t num_services, num_entries = MAX_SVC_INFO_ARRAY_SIZE;

    /*svc_info_array[5] - Initialized to 0 to avoid static analysis errors*/
    for(uint32_t i = 0 ; i < num_entries ; i++)
      memset(&svc_info_array[i], 0, sizeof(svc_info_array[i]));

    sns_logv("pxs421 ssc_connection.cpp waiting for sensors qmi service");
    qmi_wait_for_service();
    sns_logv("pxs421 ssc_connection.cpp connecting to qmi service");
    qmi_err = qmi_client_get_service_list(svc_obj, svc_info_array,
                                          &num_entries, &num_services);
    if (QMI_NO_ERR != qmi_err) {
        throw qmi_error(qmi_err, "qmi_client_get_service_list() failed");
    }

    if (num_entries == 0) {
        throw runtime_error("sensors service has no available instances");
    }

    if (_connection_closed) {
        sns_logi("connection got closed do not open qmi_channel");
        return ;
    }

    /* As only one qmi service is expected for sensors, use the 1st instance */
    qmi_service_info svc_info = svc_info_array[0];


    std::unique_lock<std::mutex> lk(_mutex);
    qmi_err = qmi_client_init(&svc_info, svc_obj, qmi_indication_cb,
                              (void*)this, &_os_params, &_qmi_handle);
    if (qmi_err != QMI_IDL_LIB_NO_ERR) {
        lk.unlock();
        throw qmi_error(qmi_err, "qmi_client_init() failed");
    }

    qmi_err = qmi_client_register_error_cb(_qmi_handle, qmi_error_cb, this);
    if (QMI_NO_ERR != qmi_err) {
        lk.unlock();
        qmi_client_release(_qmi_handle);
        throw qmi_error(qmi_err, "qmi_client_register_error_cb() failed");
    }
    lk.unlock();
    sns_logv("pxs421 ssc_connection.cpp connected to ssc for %p", (void *)this);
}

以上第一部分log 分析完毕,构造函数初始化,结果初始化的参数又是构造函数。

实际上我们发现:

suid_lookup lookup(suid_cb);  形参部分是一个函数地址,目前到此还未执行。

2:log第二段分析。

下面开始分析第二部分的log。

pxs-101 sns_client_test.cpp starting sensors test for request_suid pah813xselftest
request_suid:63, pxs-200 ssc_utils.cpp requesting suid for pah813xselftest, ts = 1446.292969s
send_request:638, pxs411 ssc_connection.cpp  ssc_qmi_connection::send_request 


handle_indication_realtime:356,  SCHED_FIFO(10) for qmi_cbk
handle_indication_realtime:376, msg_id 34 
handle_indication_realtime:438, indication, payload_len=75
handle_ssc_event:102, pxs-202 ssc_utils.cpp  suid_event for pah813xselftest, num_suids=1, ts=1446.296143s

//sns_client_test.cpp
cout <<"pxs-101 sns_client_test.cpp starting sensors test for request_suid " << s_name << endl;
lookup.request_suid(s_name);


//ssc_utils.cpp
void suid_lookup::request_suid(std::string datatype, bool default_only)
{
    sns_client_request_msg pb_req_msg;
    sns_suid_req pb_suid_req;
    string pb_suid_req_encoded;
    // TODO: add this as an optional parameter to the function

    const sensor_uid LOOKUP_SUID = {
        12370169555311111083ull,
        12370169555311111083ull
    };

//pxs->go print log:
//request_suid:63, pxs-200 ssc_utils.cpp requesting suid for pah813xselftest, ts =....
sns_logv("pxs-200 ssc_utils.cpp requesting suid for %s, ts = %fs", datatype.c_str(),
duration_cast<duration<float>>(high_resolution_clock::now().time_since_epoch()).count());

    /* populate SUID request */
    pb_suid_req.set_data_type(datatype);
    pb_suid_req.set_register_updates(true);
    pb_suid_req.set_default_only(default_only);
    pb_suid_req.SerializeToString(&pb_suid_req_encoded);

    /* populate the client request message */
    pb_req_msg.set_msg_id(SNS_SUID_MSGID_SNS_SUID_REQ);
    pb_req_msg.mutable_request()->set_payload(pb_suid_req_encoded);
    pb_req_msg.mutable_suid()->set_suid_high(LOOKUP_SUID.high);
    pb_req_msg.mutable_suid()->set_suid_low(LOOKUP_SUID.low);
    pb_req_msg.mutable_susp_config()->set_delivery_type(SNS_CLIENT_DELIVERY_WAKEUP);
    pb_req_msg.mutable_susp_config()->set_client_proc_type(SNS_STD_CLIENT_PROCESSOR_APSS);
    string pb_req_msg_encoded;
    pb_req_msg.SerializeToString(&pb_req_msg_encoded);

    _ssc_conn.send_request(pb_req_msg_encoded); // 流程go->
}


//回到最初调用
//sns_client_test.cpp
suid_lookup lookup(suid_cb);
lookup.request_suid(s_name);

//sns_utils.h
//我们发现 get_ssc_event_cb 作为成员函数 _ssc_conn 的初始化赋值
suid_lookup(suid_event_function cb);

suid_lookup::suid_lookup(suid_event_function cb):
 _cb(cb),
 _ssc_conn(get_ssc_event_cb()) //此处做了初始化
{
}

ssc_event_cb get_ssc_event_cb()
{
   return [this](const uint8_t *data, size_t size)
   {
     handle_ssc_event(data, size);// 最终打印log
   };
}

所以现在调用函数的时候
lookup.request_suid(s_name);
_ssc_conn.send_request(pb_req_msg_encoded); //
// 这部分的理解还是有些牵强。
//log 如下所示:
handle_ssc_event:102, pxs-202 ssc_utils.cpp  suid_event for pah813xselftest, num_suids=1, ts=1446.296143s

void suid_lookup::handle_ssc_event(const uint8_t *data, size_t size)
{
    /* parse the pb encoded event */
    sns_client_event_msg pb_event_msg;
    pb_event_msg.ParseFromArray(data, size);

    /* iterate over all events in the message */
    for (int i = 0; i < pb_event_msg.events_size(); i++) {
        auto& pb_event = pb_event_msg.events(i);
        if (pb_event.msg_id() != SNS_SUID_MSGID_SNS_SUID_EVENT) {
            sns_loge("invalid event msg_id=%d", pb_event.msg_id());
            continue;
        }

        sns_suid_event pb_suid_event;
        pb_suid_event.ParseFromString(pb_event.payload());
        const string& datatype =  pb_suid_event.data_type();

//pxs-go->print log
//handle_ssc_event:102, suid_event for pah813xselftest, num_suids=1, ts=3056.175049s
sns_logv("suid_event for %s, num_suids=%d, ts=%fs", 
datatype.c_str(),
pb_suid_event.suid_size(),
duration_cast<duration<float>>(high_resolution_clock::now().time_since_epoch()).count());

        /* create a list of  all suids found for this datatype */
        vector<sensor_uid> suids(pb_suid_event.suid_size());
        for (int j=0; j < pb_suid_event.suid_size(); j++) {
            suids[j] = sensor_uid(pb_suid_event.suid(j).suid_low(),
                                  pb_suid_event.suid(j).suid_high());
        }
        /* send callback for this datatype */

        _cb(datatype, suids);
    }
}

3:第三段log:

suid_cb:383, pxs-110 sns_client_test.cpp Received SUID event with length 1
ssc_enable_rt_task:253, pxs501 ssc_utils.cpp ssc_enable_rt_task: true
ssc_enable_rt_task:255, ssc_enable_rt_task : true
get_atrace_delay_checktime_ms:245, atrace_delay_checktime_ms : 0
qmi_connect:287, pxs421 ssc_connection.cpp waiting for sensors qmi service
qmi_connect:289, pxs421 ssc_connection.cpp connecting to qmi service
qmi_connect:324, pxs421 ssc_connection.cpp connected to ssc for 0xb3132100
ssc_qmi_connection:186, pxs431 ssc_connection.cpp _service_accessed 0
ssc_connection:695, pxs400 ssc_connection.cpp ssc connected
 

  suid_lookup lookup(suid_cb);
  lookup.request_suid(s_name);
为何此时又调回去执行 suid_cb 呢?

//sns_client_test.cpp

/**
 * SUID callback as registered with suid_lookup.
 */
static void
suid_cb(const std::string& datatype, const std::vector<sensor_uid>& suids)
{
  sns_logv("pxs-110 sns_client_test.cpp Received SUID event with length %zu", suids.size());
  if(suids.size() > 0)
  {
    sensor_uid suid = suids.at(0);
    connection = new ssc_connection(event_cb);

    sns_logv("pxs-111 sns_client_test.cpp Received SUID %" PRIx64 "%" PRIx64 " for '%s'",
        suid.high, suid.low, datatype.c_str());

    if(gSamplerate <= -1 && gSamplerate >= -4) {
        sns_logv("pxs-112 self test request");
        send_selftest_req(connection, &suid);
    } else  {
        sns_logv("pxs-113 self test request");    
        send_attr_request(connection, &suid);
        sleep(3);
        if(stream_type == SNS_STD_SENSOR_STREAM_TYPE_STREAMING) {
        sns_logv("pxs-114 self test request");			
          send_config_req(connection, &suid);
        }
        else if(stream_type == SNS_STD_SENSOR_STREAM_TYPE_ON_CHANGE) {
        sns_logv("pxs-115 self test request");			
            send_onchange_config_req(connection, &suid);
        }
        else {
          sns_loge("not supported format");
          exit(-1);
        }
    }
  } else {
    sns_loge("FAILED suid not found for given sensor");
    exit(1);
  }
}

4,第4段log:

suid_cb:390, pxs-111 sns_client_test.cpp Received SUID b3d9bda32e90f48b4e5e08c719699b08 for 'pah813xselftest'
suid_cb:396, pxs-113 self test request
send_request:638, pxs411 ssc_connection.cpp  ssc_qmi_connection::send_request 
handle_indication_realtime:356,  SCHED_FIFO(10) for qmi_cbk
handle_indication_realtime:376, msg_id 34 
handle_indication_realtime:438, indication, payload_len=383

5:第5段log。

event_cb:199, pxs-130 sns_client_test.cpp  Received QMI indication with length 383
event_cb:206, event[0] msg_id=128, ts=28074394019
event_cb:249, attribute ID :2
event_cb:249, attribute ID :4
event_cb:249, attribute ID :3
event_cb:249, attribute ID :6
event_cb:249, attribute ID :0
event_cb:249, attribute ID :1
event_cb:249, attribute ID :5
event_cb:249, attribute ID :7
event_cb:249, attribute ID :9
event_cb:249, attribute ID :10
event_cb:249, attribute ID :11
event_cb:249, attribute ID :12
event_cb:249, attribute ID :13
event_cb:249, attribute ID :14
event_cb:249, attribute ID :15
event_cb:249, attribute ID :16
event_cb:249, attribute ID :21
event_cb:249, attribute ID :22
event_cb:249, attribute ID :23
event_cb:249, attribute ID :24
print_sensor_info:138, --------------------- 
print_sensor_info:139, ##### ATTRIBUTES #### 
print_sensor_info:140, --------------------- 
print_sensor_info:142, SNS_STD_SENSOR_ATTRID_NAME: pah813x_selftest 

print_sensor_info:143, SNS_STD_SENSOR_ATTRID_VENDOR : pixart 

print_sensor_info:144, SNS_STD_SENSOR_ATTRID_TYPE :pah813xselftest 

print_sensor_info:158, max_delay: 1000000 uSec

print_sensor_info:159, min_delay: 1000 uSec

print_sensor_info:168, -----------------------
print_sensor_info:169, supported resolutions: 
print_sensor_info:170, -----------------------
print_sensor_info:172, 1.000000
print_sensor_info:174, -----------------------
print_sensor_info:177, supported ranges: 
print_sensor_info:178, -----------------------
print_sensor_info:180, 2147483648.000000
print_sensor_info:182, -----------------------


suid_cb:400, pxs-114 self test request
send_config_req:336, sending on normal config request and sample rate 7
send_request:638, pxs411 ssc_connection.cpp  ssc_qmi_connection::send_request 
handle_indication_realtime:376, msg_id 34  
handle_indication_realtime:438, indication, payload_len=78


event_cb:199, pxs-130 sns_client_test.cpp  Received QMI indication with length 78
event_cb:206, event[0] msg_id=1025, ts=28136737377
event_cb:228, A4100-9 Received pah813xselftest sample <54.000000, 26.000000, 9.000000, 14.000000, 7.000000, 281.000000, 275.000000, 273.000000, 274.000000>

三:编译的方法,通过log 去理解 构造函数的在 ppg sensor 实际测试中的应用:

1:sns_client_test_cpp 文件

vendor\qcom\proprietary\sensors-see\test\sns_client_example\src\sns_client_test.cpp

vendor\qcom\proprietary\sensors-see\test\sns_client_example\Android.mk

LOCAL_MODULE := sns_client_test_cpp
LOCAL_CLANG := true
LOCAL_MODULE_OWNER := qti
LOCAL_PROPRIETARY_MODULE := true

LOCAL_SHARED_LIBRARIES += libutils
LOCAL_SHARED_LIBRARIES += libprotobuf-cpp-full
LOCAL_SHARED_LIBRARIES += libsensorslog
LOCAL_SHARED_LIBRARIES += libcutils
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_SHARED_LIBRARIES += libssc

LOCAL_SRC_FILES += /src/sns_client_test.cpp

采用mmm vendor/qcom/proprietary/sensors-see/test/sns_client_example/

或者 cd vendor/qcom/proprietary/sensors-see/test/sns_client_example/ && mm

编译的bin档都没有效果

所以直接 make  sns_client_test_cpp

[100% 77/77] Install: out/target/product/msm8937_32go/vendor/bin/sns_client_test_cpp

#### build completed successfully (03:09 (mm:ss)) ####
在对应的路径把 sns_client_test_cpp 提取出来chmod 755 sns_client_test_cpp ,然后push 到手机重启即可。

2:

vendor\qcom\proprietary\commonsys-intf\sensors-see\ssc\ssc_connection.cpp

vendor\qcom\proprietary\commonsys-intf\sensors-see\ssc\ssc_utils.cpp

vendor\qcom\proprietary\commonsys-intf\sensors-see\ssc\Android.mk

LOCAL_MODULE := libssc
LOCAL_MODULE_CLASS := SHARED_LIBRARIES

# Local source files
c_sources =
c_sources += wakelock_utils.cpp
c_sources += ssc_connection.cpp
c_sources += ssc_utils.cpp
c_sources += sns_client_api_v01.c

同理编译后生成  libssc 文件路径在 vendor/lib 下,可以编译后push到手机生效。

adb push libssc.so vendor/lib/

3:测试命令

adb root

adb remount

sns_client_test_cpp pah813xselftest value  // value 为 1/9/7/8 ppg驱动去实现这几个case

msm8937_32go:/ # sns_client_test_cpp pah813xselftest 7                                                                                                
starting sensors test for press ctrl-C to stop pah813xselftest
ssc_enable_rt_task:253, ssc_enable_rt_task: true
ssc_enable_rt_task:255, ssc_enable_rt_task : true 

send_config_req:336, sending on normal config request and sample rate 7
handle_indication_realtime:376, msg_id 34 
handle_indication_realtime:438, indication, payload_len=78
event_cb:199, Received QMI indication with length 78
event_cb:206, event[0] msg_id=1025, ts=8923536519
event_cb:228, A4100-9 Received pah813xselftest sample <350.000000, 239.000000, 506.000000, 471.000000, 32.000000, 285.000000, 278.000000, 277.000000, 276.000000> 



if (selftest_state->light_leak_step == SELFTEST_PPG_4CH_LIGHT_LEAK_STEP__COMPLETE) 
    float data[9];

   data[0] = (float)selftest_state->selftest_sample.ch_t;
   data[1] = (float)selftest_state->selftest_sample.ch_a;
   data[2] = (float)selftest_state->selftest_sample.ch_b;
   data[3] = (float)selftest_state->selftest_sample.ch_c;
   data[4] = (float)selftest_state->selftest_sample.ch_d;
   data[5] = (float)selftest_state->selftest_sample.ch_a_adc_off;
   data[6] = (float)selftest_state->selftest_sample.ch_b_adc_off;
   data[7] = (float)selftest_state->selftest_sample.ch_c_adc_off;
   data[8] = (float)selftest_state->selftest_sample.ch_d_adc_off;

   pah813xselftest_report_data(this, data, ARR_SIZE(data));

   sns_sensor_util_remove_sensor_instance_stream(this, &state->ppg_data_stream);


   return true;
}
else if (selftest_state->light_leak_step == SELFTEST_PPG_4CH_LIGHT_LEAK_STEP__FAILED)
{
   float data[9];

   for (int i = 0; i < ARR_SIZE(data); ++i)
       data[i] = -1.0f;

   pah813xselftest_report_data(this, data, ARR_SIZE(data));

   sns_sensor_util_remove_sensor_instance_stream(this, &state->ppg_data_stream);


   return true;



void pah813xselftest_report_data(sns_sensor_instance *this, const float *data, size_t data_count)
{
pah_inst_state *inst_state = (pah_inst_state*)this->state->state;

sns_time timestamp = sns_get_system_time();
size_t encoded_size = pb_get_encoded_size_sensor_stream_event(data, (uint8_t)data_count);

if (inst_state->config.has_pah813x_client)
{
   pb_send_sensor_stream_event(this, pah813xselftest_pah813x_sensor_uid(),
       timestamp, SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_EVENT, SNS_STD_SENSOR_SAMPLE_STATUS_ACCURACY_HIGH, data, (uint8_t)data_count, encoded_size);
}


 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值