OpenHarmony开发者论坛

标题: 传感器sensor驱动用户端息屏后停止输出 [打印本页]

作者: shixiaocheng    时间: 2024-1-18 09:15
标题: 传感器sensor驱动用户端息屏后停止输出
[md]### 【问题描述】

1. 介绍问题现象和发生的背景
   移植了一个光亮度传感器,出现以下状况:(1)亮屏时开启用户端程序,可以打印当前环境亮度,但是息屏后就会停止输出,点击电源键亮屏后又会恢复;(2)息屏时开启用户端程序,可以打印当前环境亮度,亮屏后打印速度加快,息屏后又停止输出;请问这是什么原因呢?
2. 相关的代码(请勿使用截图)
   ```
   #include <stdio.h>
   #include "hilog/log.h"  // use HILOG_INFO to print log should include this .h
   #include "sensor_if.h"
   #include "sensor_type.h"
   #include <unistd.h>
   #include <stdlib.h>
   using OHOS::HiviewDFX::HiLog;

   /* Create a callback. */
   int SensorDataCallback(const struct SensorEvents *event)
   {
       if(event == NULL){
           return -1;
       }
       int sensorId= event->sensorId;
       if(sensorId==5){
           uint8_t *sensorData=(uint8_t *)event->data;
           printf("als sensor sensorId[%d] data[%d], data len:%d\n",sensorId, *sensorData, event->dataLen);
       }
       if(sensorId==12){
           uint16_t *sensorData=(uint16_t *)event->data;
           printf("ps sensor sensorId[%d] data[%d], data len:%d\n",sensorId, *sensorData, event->dataLen);
           if(*sensorData > 150) system("power-shell wakeup");
       }
       if(sensorId==13){
           uint16_t *sensorData=(uint16_t *)event->data;
           printf("humidity sensor sensorId[%d] data[%d], data len:%d\n",sensorId, *sensorData, event->dataLen);
       }
       return 0;
   }

   int main(int argc, char* argv[])
   {
       const OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "URI"};
       HiLog::Info(LABEL, "sxc test success");
       int32_t ret;
       struct SensorInformation *sensorInfo = NULL;
       int32_t count = 0;
       int32_t sensorInterval = 200000000; /* Set the data sampling rate to 200000000, in the unit of nanoseconds (200 ms). */
       int sensorId = 0;
       if(argc==1)
           sensorId = 5;
       else
           sensorId = atoi(argv[1]);  // 将第一个参数转换为整数
       printf("Do not enter the default light sensor, otherwise it is a distance sensor\n");
       printf("sensorId = %d\n", sensorId);
       /* 1. Create a SensorInterface instance. */
       const struct SensorInterface *sensorDev = NewSensorInterfaceInstance();
       if (sensorDev == NULL) {
           return -1;
       }
       printf("NewSensorInterfaceInstance success\n");
        /* 2. Register a sensor data callback. */
       ret = sensorDev->Register(0, SensorDataCallback);
       if (ret != 0) {
           return -1;
       }
       printf("Register success\n");
       /* 3. Obtain the list of sensors supported by the device. */
       ret = sensorDev->GetAllSensors(&sensorInfo, &count);
       if (ret != 0) {
           return -1;
       }
       printf("GetAllSensors success\n");
       for (int i = 0; i < count; i++) {
           printf("get sensorId[%d], info name[%s]\n\r", sensorInfo.sensorId, sensorInfo.sensorName);
       }
       /* 4. Set the sensor sampling rate. */
       ret = sensorDev->SetBatch(sensorId, sensorInterval, 0);
       if (ret != 0) {
           printf("SetBatch failed!\n");
           return -1;
       }
       printf("SetBatch success,sensorId[%d]\n",sensorId);
       /* 5. Enable the sensor. */
       ret = sensorDev->Enable(sensorId);
       if (ret != 0) {
           printf("Enable failed!\n");
           return -1;
       }
       printf("Enable success,sensorId[%d]\n",sensorId);
       usleep(60*1000 * 1000);
         /* 6. Disable the sensor. */
       ret = sensorDev->Disable(sensorId);
       if (ret != 0) {
           printf("Disable failed!\n");
           return -1;
       }
       printf("Disable success,sensorId[%d]\n",sensorId);
       /* 7. Unregister the sensor data callback. */
       ret = sensorDev->Unregister(0, SensorDataCallback);
       if (ret != 0) {
           printf("Unregister failed!\n");
           return -1;
       }
       printf("Unregister success,sensorId[%d]\n",sensorId);
       /* 8. Release the SensorInterface instance.*/
       ret = FreeSensorInterfaceInstance();
       if (ret != 0) {
           return -1;
       }
       printf("FreeSensorInterfaceInstance success\n");
       return 0;
   }
   ```
3. 运行结果、错误截图
4. 我尝试过的解决方法和结果
5. 我想要达到的结果
   息屏或亮屏时都可以正常输出。

### 【运行环境】

硬件:rk3568
ROM版本:4.0
DevEvoStudio版本:
SDK版本:
[/md]
作者: 深开鸿_王石    时间: 2024-1-18 11:44
抓个系统log看看呢,是不是电源管理那个回调线程停了
作者: shixiaocheng    时间: 2024-1-19 09:04
知道原因了,文件‘//base/powermgr/display_manager/service/native/src/display_power_mgr_service.cpp’里面会对ambient sensor进行判断,息屏时关闭以省电




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5