فهرست منبع

[add] add vdevice : v_spo2.c
[mod] modify v_barometer.c v_heartRate.c v_stepcounter.c SConscript

yuanjie 4 سال پیش
والد
کامیت
294daef006
5فایلهای تغییر یافته به همراه208 افزوده شده و 12 حذف شده
  1. 3 0
      SConscript
  2. 4 4
      v_barometer.c
  3. 4 4
      v_heartRate.c
  4. 190 0
      v_spo2.c
  5. 7 4
      v_stepcounter.c

+ 3 - 0
SConscript

@@ -46,6 +46,9 @@ if GetDepend(['PKG_USING_VIRTUAL_SENSOR_TEMP']):
 if GetDepend(['PKG_USING_VIRTUAL_SENSOR_TVOC']):
     src += Glob('v_tvoc.c')
 
+if GetDepend(['PKG_USING_VIRTUAL_SENSOR_SPO2']):
+    src += Glob('v_spo2.c')
+
 group = DefineGroup('vsensor', src, depend = ['PKG_USING_VIRTUAL_SENSOR'], CPPPATH = CPPPATH)
 
 Return('group')

+ 4 - 4
v_barometer.c

@@ -99,13 +99,13 @@ static rt_err_t _sensor_set_power(rt_sensor_t sensor, rt_uint8_t power)
 static rt_size_t baro_sensor_fetch_data(struct rt_sensor_device* sensor, void* buf, rt_size_t len)
 {
     struct rt_sensor_data* data = buf;
-    rt_int16_t max_range = 0;
+    //rt_int16_t max_range = 0;
 
-    max_range = baro_info_tbl[SENS_BARO_01].range_max - baro_info_tbl[SENS_BARO_01].range_min;
+    //max_range = baro_info_tbl[SENS_BARO_01].range_max - baro_info_tbl[SENS_BARO_01].range_min;
     data->type = RT_SENSOR_CLASS_BARO;
-    data->data.baro = rand() % max_range + baro_info_tbl[SENS_BARO_01].range_min;
+    data->data.baro = 900 + rand() % 200;
     data->timestamp = rt_sensor_get_ts();
-    LOG_D("%s:%d", __func__, data->data.baro);
+    //LOG_D("%s:%d", __func__, data->data.baro);
 
     return RT_EOK;
 }

+ 4 - 4
v_heartRate.c

@@ -99,13 +99,13 @@ static rt_err_t _sensor_set_power(rt_sensor_t sensor, rt_uint8_t power)
 static rt_size_t hr_sensor_fetch_data(struct rt_sensor_device* sensor, void* buf, rt_size_t len)
 {
     struct rt_sensor_data* data = buf;
-    rt_int16_t max_range = 0;
+    //rt_int16_t max_range = 0;
 
-    max_range = hr_info_tbl[SENS_HR_01].range_max - hr_info_tbl[SENS_HR_01].range_min;
+    //max_range = hr_info_tbl[SENS_HR_01].range_max - hr_info_tbl[SENS_HR_01].range_min;
     data->type = RT_SENSOR_CLASS_HR;
-    data->data.hr = rand() % max_range + hr_info_tbl[SENS_HR_01].range_min;
+    data->data.hr = 65 + rand() % 50;
     data->timestamp = rt_sensor_get_ts();
-    LOG_D("%s:%d", __func__, data->data.hr);
+    //LOG_D("%s:%d", __func__, data->data.hr);
 
     return RT_EOK;
 }

+ 190 - 0
v_spo2.c

@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2021-04-01     stackRyan    add spo2 virtual sensor
+ */
+
+#include <rtthread.h>
+
+#ifdef PKG_USING_VIRTUAL_SENSOR_SPO2
+
+#include "sensor.h"
+#include <stdlib.h>
+
+#define DBG_ENABLE
+#define DBG_SECTION_NAME    "v_spo2"
+#define DBG_LEVEL           DBG_LOG
+#include <rtdbg.h>
+
+enum SENS_SPO2_ID
+{
+    SENS_SPO2_01 = 0, //SPO2
+    SENS_SPO2_MAX,
+};
+
+#define SENS_BUS_NAME                   "sens_bus"
+#define SENS_SPO2_01_SENSOR_ID            (RT_SENSOR_CLASS_SPO2 + 0x10)
+
+struct sens_spo2
+{
+    char* dev_name;
+    rt_uint8_t sens_id;
+};
+
+static struct sens_spo2 sens_spo2_tbl[SENS_SPO2_MAX] =
+{
+    {V_SENS_SPO2_DEV_NAME,    0x00 }, /* SPO2 */
+};
+
+static struct rt_sensor_info spo2_info_tbl[SENS_SPO2_MAX] =
+{
+    {RT_SENSOR_CLASS_SPO2,  RT_SENSOR_VENDOR_UNKNOWN,   RT_NULL,    RT_SENSOR_UNIT_PERCENT,      RT_SENSOR_INTF_UART,     200,   0,   1 },
+};
+
+static rt_uint8_t sensor_get_id(rt_uint8_t sens_index)
+{
+    rt_uint8_t chip_id = 0x00;
+
+    switch (sens_index)
+    {
+    case SENS_SPO2_01:
+        chip_id = SENS_SPO2_01_SENSOR_ID;
+        break;
+    default:
+        break;
+    }
+
+    return chip_id;
+}
+
+static int sensor_init(rt_uint8_t index)
+{
+    sens_spo2_tbl[index].sens_id = sensor_get_id(index);
+
+    return RT_EOK;
+}
+
+static void* _sensor_create(struct rt_sensor_intf* intf, rt_uint8_t index)
+{
+    if (sensor_init(index) != RT_EOK)
+    {
+        LOG_E("%s:error!", __func__);
+    }
+
+    return 0;
+}
+
+static rt_err_t _sensor_set_odr(rt_sensor_t sensor, rt_uint16_t odr)
+{
+    LOG_D("%s:odr=%d", __func__, odr);
+    return RT_EOK;
+}
+static rt_err_t _sensor_set_range(rt_sensor_t sensor, rt_uint16_t range)
+{
+    LOG_D("%s:range=%d", __func__, range);
+    return RT_EOK;
+}
+
+static rt_err_t _sensor_set_power(rt_sensor_t sensor, rt_uint8_t power)
+{
+    rt_int8_t rslt = 0;
+    LOG_D("%s:power=%d", __func__, power);
+    return rslt;
+}
+
+static rt_size_t spo2_sensor_fetch_data(struct rt_sensor_device* sensor, void* buf, rt_size_t len)
+{
+    struct rt_sensor_data* data = buf;
+
+    data->type = RT_SENSOR_CLASS_SPO2;
+    data->data.spo2 = 90 + rand() % 10;
+    data->timestamp = rt_sensor_get_ts();
+    return RT_EOK;
+}
+
+static rt_err_t spo2_sensor_control(struct rt_sensor_device* sensor, int cmd, void* args)
+{
+    rt_err_t result = RT_EOK;
+
+    switch (cmd)
+    {
+    case RT_SENSOR_CTRL_GET_ID:
+        *(rt_uint8_t*)args = sens_spo2_tbl[SENS_SPO2_01].sens_id;
+        break;
+    case RT_SENSOR_CTRL_SET_ODR:
+        result = _sensor_set_odr(sensor, (rt_uint32_t)args & 0xffff);
+        break;
+    case RT_SENSOR_CTRL_SET_RANGE:
+        result = _sensor_set_range(sensor, (rt_uint32_t)args);
+        break;
+    case RT_SENSOR_CTRL_SET_POWER:
+        result = _sensor_set_power(sensor, (rt_uint32_t)args & 0xff);
+        break;
+    case RT_SENSOR_CTRL_SELF_TEST:
+        /* TODO */
+        result = -RT_EINVAL;
+        break;
+    default:
+        return -RT_EINVAL;
+    }
+    return result;
+}
+
+static struct rt_sensor_ops sensor_ops[] =
+{
+    {spo2_sensor_fetch_data, spo2_sensor_control},
+};
+
+int rt_vd_sens_spo2_init(void)
+{
+    rt_int8_t result;
+    rt_uint8_t index = 0;
+    rt_sensor_t sensor_dat = RT_NULL;
+    struct rt_sensor_config cfg;
+
+    cfg.intf.dev_name = SENS_BUS_NAME;
+    cfg.intf.user_data = RT_NULL;
+    cfg.irq_pin.pin = RT_PIN_NONE;
+
+    for (index = 0; index < SENS_SPO2_MAX; index++)
+    {
+        _sensor_create(&cfg.intf, index);
+        sensor_dat = rt_calloc(1, sizeof(struct rt_sensor_device));
+        if (sensor_dat == RT_NULL)
+        {
+            LOG_E("rt_hw_sens_init:rt_calloc err!");
+            return -RT_ERROR;
+        }
+
+        sensor_dat->info.type = spo2_info_tbl[index].type;
+        sensor_dat->info.vendor = spo2_info_tbl[index].vendor;
+        sensor_dat->info.model = spo2_info_tbl[index].model;
+        sensor_dat->info.unit = spo2_info_tbl[index].unit;
+        sensor_dat->info.intf_type = spo2_info_tbl[index].intf_type;
+        sensor_dat->info.range_max = spo2_info_tbl[index].range_max;
+        sensor_dat->info.range_min = spo2_info_tbl[index].range_min;
+        sensor_dat->info.period_min = spo2_info_tbl[index].period_min;
+
+        rt_memcpy(&sensor_dat->config, &cfg, sizeof(struct rt_sensor_config));
+        sensor_dat->ops = &sensor_ops[index];
+
+        result = rt_hw_sensor_register(sensor_dat, sens_spo2_tbl[index].dev_name, RT_DEVICE_FLAG_RDWR, RT_NULL);
+        if (result != RT_EOK)
+        {
+            LOG_E("device register err code: %d", result);
+            rt_free(sensor_dat);
+            return -RT_ERROR;
+        }
+    }
+
+    return RT_EOK;
+}
+
+INIT_DEVICE_EXPORT(rt_vd_sens_spo2_init);
+
+#endif
+

+ 7 - 4
v_stepcounter.c

@@ -99,13 +99,16 @@ static rt_err_t _sensor_set_power(rt_sensor_t sensor, rt_uint8_t power)
 static rt_size_t step_sensor_fetch_data(struct rt_sensor_device* sensor, void* buf, rt_size_t len)
 {
     struct rt_sensor_data* data = buf;
-    rt_int16_t max_range = 0;
+    //rt_uint32_t max_range = 0;
+    static rt_uint32_t step_count = 0;
 
-    max_range = step_info_tbl[SENS_STEP_01].range_max - step_info_tbl[SENS_STEP_01].range_min;
+    //max_range = step_info_tbl[SENS_STEP_01].range_max - step_info_tbl[SENS_STEP_01].range_min;
     data->type = RT_SENSOR_CLASS_STEP;
-    data->data.step = rand() % max_range + step_info_tbl[SENS_STEP_01].range_min;
+    int steps = rand() % 10;
+    data->data.step = step_count + steps;
+    step_count += steps;
     data->timestamp = rt_sensor_get_ts();
-    LOG_D("%s:%d", __func__, data->data.step);
+    //LOG_D("%s:%d", __func__, data->data.step);
 
     return RT_EOK;
 }