From f2ba792380cbbe1d2aed8c3d9d1433b980259445 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Tue, 14 Dec 2021 10:32:17 +0800 Subject: [PATCH 1/6] sync upstream branch and add 'as830' sensor of ch4 --- APP_Framework/Applications/main.c | 2 + APP_Framework/Applications/sensor_app/Kconfig | 10 + .../Applications/sensor_app/Makefile | 4 + .../Applications/sensor_app/ch4_as830.c | 34 +++ APP_Framework/Framework/sensor/Kconfig | 7 + APP_Framework/Framework/sensor/Makefile | 4 + APP_Framework/Framework/sensor/ch4/Kconfig | 43 ++++ APP_Framework/Framework/sensor/ch4/Makefile | 5 + .../Framework/sensor/ch4/as830/Makefile | 3 + .../Framework/sensor/ch4/as830/as830.c | 223 ++++++++++++++++++ APP_Framework/Framework/sensor/sensor.h | 2 + Ubiquitous/XiUOS/board/gapuino/board.c | 19 +- 12 files changed, 355 insertions(+), 1 deletion(-) create mode 100644 APP_Framework/Applications/sensor_app/ch4_as830.c create mode 100644 APP_Framework/Framework/sensor/ch4/Kconfig create mode 100644 APP_Framework/Framework/sensor/ch4/Makefile create mode 100644 APP_Framework/Framework/sensor/ch4/as830/Makefile create mode 100644 APP_Framework/Framework/sensor/ch4/as830/as830.c diff --git a/APP_Framework/Applications/main.c b/APP_Framework/Applications/main.c index 3a12d762f..b9d1a8d62 100644 --- a/APP_Framework/Applications/main.c +++ b/APP_Framework/Applications/main.c @@ -17,6 +17,7 @@ extern int FrameworkInit(); extern void ApplicationOtaTaskInit(void); +extern void Ch4As830(void); int main(void) { printf("Hello, world!\n"); @@ -24,6 +25,7 @@ int main(void) #ifdef APPLICATION_OTA ApplicationOtaTaskInit(); #endif + Ch4As830(); return 0; } // int cppmain(void); diff --git a/APP_Framework/Applications/sensor_app/Kconfig b/APP_Framework/Applications/sensor_app/Kconfig index 86eaeb7cd..124beb459 100755 --- a/APP_Framework/Applications/sensor_app/Kconfig +++ b/APP_Framework/Applications/sensor_app/Kconfig @@ -5,6 +5,16 @@ menu "sensor app" default n if APPLICATION_SENSOR + menuconfig APPLICATION_SENSOR_CH4 + bool "Using sensor CH4 apps" + default n + + if APPLICATION_SENSOR_CH4 + config APPLICATION_SENSOR_CH4_AS830 + bool "Using sensor AS830 apps" + default n + endif + menuconfig APPLICATION_SENSOR_CO2 bool "Using sensor CO2 apps" default n diff --git a/APP_Framework/Applications/sensor_app/Makefile b/APP_Framework/Applications/sensor_app/Makefile index 63010b016..63b624505 100644 --- a/APP_Framework/Applications/sensor_app/Makefile +++ b/APP_Framework/Applications/sensor_app/Makefile @@ -1,5 +1,9 @@ SRC_FILES := +ifeq ($(CONFIG_APPLICATION_SENSOR_CH4_AS830), y) + SRC_FILES += ch4_as830.c +endif + ifeq ($(CONFIG_APPLICATION_SENSOR_CO2_ZG09), y) SRC_FILES += co2_zg09.c endif diff --git a/APP_Framework/Applications/sensor_app/ch4_as830.c b/APP_Framework/Applications/sensor_app/ch4_as830.c new file mode 100644 index 000000000..7de5f14f6 --- /dev/null +++ b/APP_Framework/Applications/sensor_app/ch4_as830.c @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file ch4_as830.c + * @brief CH4 AS830 example + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.10 + */ + +#include +#include + +/** + * @description: Read a ch4 + * @return 0 + */ +void Ch4As830(void) +{ + struct SensorQuantity *ch4 = SensorQuantityFind(SENSOR_QUANTITY_AS830_CH4, SENSOR_QUANTITY_CH4); + SensorQuantityOpen(ch4); + printf("CH4 : %d %%LTL\n", SensorQuantityRead(ch4)); + SensorQuantityClose(ch4); +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/Kconfig b/APP_Framework/Framework/sensor/Kconfig index a8ffcb82c..669c26cd2 100644 --- a/APP_Framework/Framework/sensor/Kconfig +++ b/APP_Framework/Framework/sensor/Kconfig @@ -4,6 +4,13 @@ menuconfig SUPPORT_SENSOR_FRAMEWORK select TRANSFORM_LAYER_ATTRIUBUTE if SUPPORT_SENSOR_FRAMEWORK + menuconfig SENSOR_CH4 + bool "Using Ch4 sensor device" + default n + if SENSOR_CH4 + source "$APP_DIR/Framework/sensor/ch4/Kconfig" + endif + menuconfig SENSOR_CO2 bool "Using CO2 sensor device" default n diff --git a/APP_Framework/Framework/sensor/Makefile b/APP_Framework/Framework/sensor/Makefile index d3772dcba..d8cdf1418 100644 --- a/APP_Framework/Framework/sensor/Makefile +++ b/APP_Framework/Framework/sensor/Makefile @@ -1,5 +1,9 @@ SRC_FILES := sensor.c +ifeq ($(CONFIG_SENSOR_CH4),y) + SRC_DIR += ch4 +endif + ifeq ($(CONFIG_SENSOR_CO2),y) SRC_DIR += co2 endif diff --git a/APP_Framework/Framework/sensor/ch4/Kconfig b/APP_Framework/Framework/sensor/ch4/Kconfig new file mode 100644 index 000000000..7f3ef3d23 --- /dev/null +++ b/APP_Framework/Framework/sensor/ch4/Kconfig @@ -0,0 +1,43 @@ + +config SENSOR_AS830 + bool "Using as830" + default n + + if SENSOR_AS830 + config SENSOR_DEVICE_AS830 + string "as830 sensor name" + default "as830_1" + + config SENSOR_QUANTITY_AS830_CH4 + string "as830 quantity name" + default "ch4_1" + + if ADD_XIUOS_FETURES + config SENSOR_AS830_DRIVER_EXTUART + bool "Using extra uart to support as830" + default y + + config SENSOR_DEVICE_AS830_DEV + string "as830 device uart path" + default "/dev/uart2_dev2" + depends on !SENSOR_AS830_DRIVER_EXTUART + + if SENSOR_AS830_DRIVER_EXTUART + config SENSOR_DEVICE_AS830_DEV + string "as830 device extra uart path" + default "/dev/extuart_dev4" + + config SENSOR_DEVICE_AS830_DEV_EXT_PORT + int "if AS830 device using extuart, choose port" + default "4" + endif + endif + + if ADD_NUTTX_FETURES + + endif + + if ADD_RTTHREAD_FETURES + + endif + endif diff --git a/APP_Framework/Framework/sensor/ch4/Makefile b/APP_Framework/Framework/sensor/ch4/Makefile new file mode 100644 index 000000000..913dda125 --- /dev/null +++ b/APP_Framework/Framework/sensor/ch4/Makefile @@ -0,0 +1,5 @@ +ifeq ($(CONFIG_SENSOR_AS830),y) + SRC_DIR += as830 +endif + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/ch4/as830/Makefile b/APP_Framework/Framework/sensor/ch4/as830/Makefile new file mode 100644 index 000000000..bc432574b --- /dev/null +++ b/APP_Framework/Framework/sensor/ch4/as830/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := as830.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/ch4/as830/as830.c b/APP_Framework/Framework/sensor/ch4/as830/as830.c new file mode 100644 index 000000000..1a5d90201 --- /dev/null +++ b/APP_Framework/Framework/sensor/ch4/as830/as830.c @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file as830.c + * @brief AS830 CH4 driver base sensor + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.10 + */ + +#include + +static struct SensorDevice as830; + +static struct SensorProductInfo info = +{ + SENSOR_ABILITY_CH4, + "xxxxx", + "AS830", +}; + +/** + * @description: Open AS830 sensor device + * @param sdev - sensor device pointer + * @return success: 1 , failure: other + */ +static int SensorDeviceOpen(struct SensorDevice *sdev) +{ + int result = 0; + + sdev->fd = PrivOpen(SENSOR_DEVICE_AS830_DEV, O_RDWR); + + struct SerialDataCfg cfg; + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_buffer_size = 128; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = 0; + cfg.serial_invert_mode = 0; +#ifdef SENSOR_AS830_DRIVER_EXTUART + cfg.ext_uart_no = SENSOR_DEVICE_AS830_DEV_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg); + + sdev->done->ioctl(sdev, SENSOR_DEVICE_PASSIVE); + + return result; +} + +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceRead(struct SensorDevice *sdev, size_t len) +{ + uint8_t tmp = 0; + uint8_t idx = 0; + + while (1) { + if (PrivRead(sdev->fd, &tmp, 1) == 1) { + sdev->buffer[idx++] = tmp; + } + if(0xA == tmp){ + break; + } + } + + return idx; +} + +static struct SensorDone done = +{ + SensorDeviceOpen, + NULL, + SensorDeviceRead, + NULL, + NULL, +}; + +/** + * @description: Init AS830 sensor and register + * @return void + */ +static void SensorDeviceAs830Init(void) +{ + as830.name = SENSOR_DEVICE_AS830; + as830.info = &info; + as830.done = &done; + + SensorDeviceRegister(&as830); +} + + +/* check data*/ +static uint8_t CH4_check(uint8_t *packet) +{ + uint8_t i, high, low; + uint8_t checksum = 0; + for( i = 0; i < 10; i++) + { + if(packet[i] == 0x09) + break; + checksum += packet[i]; + } + checksum = (unsigned char)(-(signed char)checksum); + high = (checksum & 0xF0) >> 4; + if((high <= 0x0F) && (high >= 0x0A)) + high += 0x37; + else if((high <= 0x09) && (high >= 0x00)) + high += 0x30; + low = (checksum & 0x0F); + if((low <= 0x0F) && (low >= 0x0A)) + low += 0x37; + else if((low <= 0x09) && (low >= 0x00)) + low += 0x30; + if((high == packet[i + 1]) && (low == packet[i + 2])) + return 0; + + return -1; +} + + +static struct SensorQuantity as830_ch4; + +/** + * @description: Analysis AS830 CH4 result + * @param quant - sensor quantity pointer + * @return quantity value + */ +static int32_t QuantityRead(struct SensorQuantity *quant) +{ + if (!quant) + return -1; + + uint32_t result; + uint32_t len = 0; + if (quant->sdev->done->read != NULL) { + if(quant->sdev->status == SENSOR_DEVICE_PASSIVE) { + len = quant->sdev->done->read(quant->sdev, 7); + if (len == 0) + { + printf("error read data length = 0.\n"); + return -1; + } + + if(CH4_check(quant->sdev->buffer) == 0) + { + for(int i = 0; i < len; i++) + { + if(quant->sdev->buffer[i] == 0x09) + { + break; + } + result = result *10 + (quant->sdev->buffer[i] - 0x30); + } + + if (result > quant->value.max_value) + quant->value.max_value = result; + else if (result < quant->value.min_value) + quant->value.min_value = result; + quant->value.last_value = result; + + return result; + } + else + { + printf("This reading is wrong\n"); + result = SENSOR_QUANTITY_VALUE_ERROR; + return result; + } + } + if (quant->sdev->status == SENSOR_DEVICE_ACTIVE) + { + printf("Please set passive mode.\n"); + } + }else{ + printf("%s don't have read done.\n", quant->name); + } + + return -1; +} + +/** + * @description: Init AS830 CH4 quantity and register + * @return 0 + */ +int As830Ch4Init(void) +{ + SensorDeviceAs830Init(); + + as830_ch4.name = SENSOR_QUANTITY_AS830_CH4; + as830_ch4.type = SENSOR_QUANTITY_CH4; + as830_ch4.value.decimal_places = 0; + as830_ch4.value.max_std = 1000; + as830_ch4.value.min_std = 350; + as830_ch4.value.last_value = SENSOR_QUANTITY_VALUE_ERROR; + as830_ch4.value.max_value = SENSOR_QUANTITY_VALUE_ERROR; + as830_ch4.value.min_value = SENSOR_QUANTITY_VALUE_ERROR; + as830_ch4.sdev = &as830; + as830_ch4.ReadValue = QuantityRead; + + SensorQuantityRegister(&as830_ch4); + + return 0; +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/sensor.h b/APP_Framework/Framework/sensor/sensor.h index 801f7991d..a9bcecbc1 100644 --- a/APP_Framework/Framework/sensor/sensor.h +++ b/APP_Framework/Framework/sensor/sensor.h @@ -51,6 +51,7 @@ extern "C" { #define SENSOR_ABILITY_CO ((uint32_t)(1 << SENSOR_QUANTITY_CO)) #define SENSOR_ABILITY_PM ((uint32_t)(1 << SENSOR_QUANTITY_PM)) #define SENSOR_ABILITY_VOICE ((uint32_t)(1 << SENSOR_QUANTITY_VOICE)) +#define SENSOR_ABILITY_CH4 ((uint32_t)(1 << SENSOR_QUANTITY_CH4)) struct SensorProductInfo { uint32_t ability; /* Bitwise OR of sensor ability */ @@ -89,6 +90,7 @@ enum SensorQuantityType { SENSOR_QUANTITY_CO, SENSOR_QUANTITY_PM, SENSOR_QUANTITY_VOICE, + SENSOR_QUANTITY_CH4, /* ...... */ SENSOR_QUANTITY_END, }; diff --git a/Ubiquitous/XiUOS/board/gapuino/board.c b/Ubiquitous/XiUOS/board/gapuino/board.c index 836151f1a..d484bd3da 100755 --- a/Ubiquitous/XiUOS/board/gapuino/board.c +++ b/Ubiquitous/XiUOS/board/gapuino/board.c @@ -30,6 +30,23 @@ extern void timer_initialize(void); extern void gapuino_sysinit(void); extern unsigned int __bss_end__; +/* Return core id. */ +uint32_t _procid( void ) +{ + uint32_t ulProcid = 0; + __asm__ volatile( "csrr %0, mhartid" : "=r"( ulProcid ) ); + ulProcid = ulProcid & 0xf; + return ( ulProcid ); +} + +/* Return cluster id. */ +uint32_t _clusterid( void ) +{ + uint32_t ulCluster = 0; + __asm__ volatile( "csrr %0, mhartid" : "=r"( ulCluster ) ); + ulCluster = ulCluster >> 5; + return ( ulCluster ); +} void GapuinoStart(uint32_t mhartid) { @@ -51,7 +68,7 @@ void InitBoardHardware(void) timer_initialize(); KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, GAP8_SRAM_SIZE); /* initialize memory system */ - + KPrintf("gap8 cluster id: [0x%x], _procid: [0x%x]\n", _clusterid(),_procid()); KPrintf("board init done.\n"); KPrintf("start kernel...\n"); return; From e366c8817cb7d96079e284d1b90be3a11d849497 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Tue, 14 Dec 2021 10:37:22 +0800 Subject: [PATCH 2/6] repair a bug of inputting password of shell --- APP_Framework/Applications/main.c | 5 +++-- Ubiquitous/XiUOS/board/gapuino/board.c | 3 ++- Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/APP_Framework/Applications/main.c b/APP_Framework/Applications/main.c index b9d1a8d62..6cd956945 100644 --- a/APP_Framework/Applications/main.c +++ b/APP_Framework/Applications/main.c @@ -17,10 +17,11 @@ extern int FrameworkInit(); extern void ApplicationOtaTaskInit(void); -extern void Ch4As830(void); +extern void ShowMemory(void); +extern long ShowTask(void); int main(void) { - printf("Hello, world!\n"); + printf("Hello, world! Running on gapuino board.\n"); FrameworkInit(); #ifdef APPLICATION_OTA ApplicationOtaTaskInit(); diff --git a/Ubiquitous/XiUOS/board/gapuino/board.c b/Ubiquitous/XiUOS/board/gapuino/board.c index d484bd3da..7b16b53c6 100755 --- a/Ubiquitous/XiUOS/board/gapuino/board.c +++ b/Ubiquitous/XiUOS/board/gapuino/board.c @@ -68,7 +68,8 @@ void InitBoardHardware(void) timer_initialize(); KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, GAP8_SRAM_SIZE); /* initialize memory system */ - KPrintf("gap8 cluster id: [0x%x], _procid: [0x%x]\n", _clusterid(),_procid()); + KPrintf("gap8 cluster id: [0x%x], _procid: [0x%x]\n", _clusterid(),_procid()); + KPrintf("board init done.\n"); KPrintf("start kernel...\n"); return; diff --git a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c index dd14df382..564d8325e 100644 --- a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c +++ b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c @@ -155,6 +155,7 @@ ShellCommand* shellSeekCommand(Shell *shell, */ void shellInit(Shell *shell, char *buffer, unsigned short size) { + shell->parser.length = 0; shell->parser.cursor = 0; shell->history.offset = 0; @@ -187,6 +188,7 @@ void shellInit(Shell *shell, char *buffer, unsigned short size) SHELL_DEFAULT_USER, shell->commandList.base, 0)); + shellWriteCommandLine(shell, 1); } @@ -863,7 +865,7 @@ ShellCommand* shellSeekCommand(Shell *shell, name = shellGetCommandName(&base[i]); if (!compareLength) { - if (strcmp(cmd, name) == 0) + if (strncmp(cmd, name, strlen(cmd)) == 0) { return &base[i]; } From 4a8ac7c02b8ed49d4d5b56d677c1a0443b52b066 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Tue, 14 Dec 2021 14:07:09 +0800 Subject: [PATCH 3/6] repair ch4 test --- APP_Framework/Applications/framework_init.c | 5 +++++ APP_Framework/Applications/main.c | 5 +---- APP_Framework/Framework/sensor/ch4/Kconfig | 4 ++-- APP_Framework/Framework/sensor/ch4/as830/as830.c | 6 ++++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/APP_Framework/Applications/framework_init.c b/APP_Framework/Applications/framework_init.c index f060dbab1..cc95d6152 100644 --- a/APP_Framework/Applications/framework_init.c +++ b/APP_Framework/Applications/framework_init.c @@ -29,6 +29,7 @@ extern int Hs300xTemperatureInit(void); extern int Hs300xHumidityInit(void); extern int Ps5308Pm1_0Init(void); extern int Zg09Co2Init(void); +extern int As830Ch4Init(void); typedef int (*InitFunc)(void); struct InitDesc @@ -89,6 +90,10 @@ static struct InitDesc sensor_desc[] = { "zg09_co2", Zg09Co2Init }, #endif +#ifdef SENSOR_AS830 + { "ch4_as830", As830Ch4Init }, +#endif + { "NULL", NULL }, }; diff --git a/APP_Framework/Applications/main.c b/APP_Framework/Applications/main.c index 6cd956945..b10557a97 100644 --- a/APP_Framework/Applications/main.c +++ b/APP_Framework/Applications/main.c @@ -17,16 +17,13 @@ extern int FrameworkInit(); extern void ApplicationOtaTaskInit(void); -extern void ShowMemory(void); -extern long ShowTask(void); int main(void) { - printf("Hello, world! Running on gapuino board.\n"); + printf("Hello, world! \n"); FrameworkInit(); #ifdef APPLICATION_OTA ApplicationOtaTaskInit(); #endif - Ch4As830(); return 0; } // int cppmain(void); diff --git a/APP_Framework/Framework/sensor/ch4/Kconfig b/APP_Framework/Framework/sensor/ch4/Kconfig index 7f3ef3d23..f973600dc 100644 --- a/APP_Framework/Framework/sensor/ch4/Kconfig +++ b/APP_Framework/Framework/sensor/ch4/Kconfig @@ -25,11 +25,11 @@ config SENSOR_AS830 if SENSOR_AS830_DRIVER_EXTUART config SENSOR_DEVICE_AS830_DEV string "as830 device extra uart path" - default "/dev/extuart_dev4" + default "/dev/extuart_dev1" config SENSOR_DEVICE_AS830_DEV_EXT_PORT int "if AS830 device using extuart, choose port" - default "4" + default "1" endif endif diff --git a/APP_Framework/Framework/sensor/ch4/as830/as830.c b/APP_Framework/Framework/sensor/ch4/as830/as830.c index 1a5d90201..edd7f6d8c 100644 --- a/APP_Framework/Framework/sensor/ch4/as830/as830.c +++ b/APP_Framework/Framework/sensor/ch4/as830/as830.c @@ -39,6 +39,10 @@ static int SensorDeviceOpen(struct SensorDevice *sdev) int result = 0; sdev->fd = PrivOpen(SENSOR_DEVICE_AS830_DEV, O_RDWR); + if (sdev->fd < 0) { + printf("open %s error\n", SENSOR_DEVICE_AS830_DEV); + return -1; + } struct SerialDataCfg cfg; cfg.serial_baud_rate = BAUD_RATE_9600; @@ -58,8 +62,6 @@ static int SensorDeviceOpen(struct SensorDevice *sdev) ioctl_cfg.args = &cfg; result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg); - sdev->done->ioctl(sdev, SENSOR_DEVICE_PASSIVE); - return result; } From 856edb7ec647d6236db21974bc245e45262eddcf Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Wed, 15 Dec 2021 11:10:56 +0800 Subject: [PATCH 4/6] add sensor 'TB600B_IAQ10' to sensor framework --- APP_Framework/Applications/framework_init.c | 5 + APP_Framework/Applications/sensor_app/Kconfig | 10 + .../Applications/sensor_app/Makefile | 4 + .../sensor_app/iaq_tb600b_iaq10.c | 45 ++++ APP_Framework/Framework/sensor/Kconfig | 7 + APP_Framework/Framework/sensor/Makefile | 4 + APP_Framework/Framework/sensor/iaq/Kconfig | 43 ++++ APP_Framework/Framework/sensor/iaq/Makefile | 5 + .../sensor/iaq/tb600b_iaq10/Makefile | 3 + .../sensor/iaq/tb600b_iaq10/tb600b_iaq10.c | 235 ++++++++++++++++++ APP_Framework/Framework/sensor/sensor.h | 2 + 11 files changed, 363 insertions(+) create mode 100644 APP_Framework/Applications/sensor_app/iaq_tb600b_iaq10.c create mode 100644 APP_Framework/Framework/sensor/iaq/Kconfig create mode 100644 APP_Framework/Framework/sensor/iaq/Makefile create mode 100644 APP_Framework/Framework/sensor/iaq/tb600b_iaq10/Makefile create mode 100644 APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c diff --git a/APP_Framework/Applications/framework_init.c b/APP_Framework/Applications/framework_init.c index cc95d6152..be2cfbb98 100644 --- a/APP_Framework/Applications/framework_init.c +++ b/APP_Framework/Applications/framework_init.c @@ -30,6 +30,7 @@ extern int Hs300xHumidityInit(void); extern int Ps5308Pm1_0Init(void); extern int Zg09Co2Init(void); extern int As830Ch4Init(void); +extern int Tb600bIaq10IaqInit(void); typedef int (*InitFunc)(void); struct InitDesc @@ -94,6 +95,10 @@ static struct InitDesc sensor_desc[] = { "ch4_as830", As830Ch4Init }, #endif +#ifdef SENSOR_TB600B_IAQ10 + { "iaq_tb600b_iaq10", Tb600bIaq10IaqInit }, +#endif + { "NULL", NULL }, }; diff --git a/APP_Framework/Applications/sensor_app/Kconfig b/APP_Framework/Applications/sensor_app/Kconfig index 124beb459..ad47611d0 100755 --- a/APP_Framework/Applications/sensor_app/Kconfig +++ b/APP_Framework/Applications/sensor_app/Kconfig @@ -5,6 +5,16 @@ menu "sensor app" default n if APPLICATION_SENSOR + menuconfig APPLICATION_SENSOR_IAQ + bool "Using sensor IAQ apps" + default n + + if APPLICATION_SENSOR_IAQ + config APPLICATION_SENSOR_IAQ_TB600B_IAQ10 + bool "Using sensor TB600B_IAQ10 apps" + default n + endif + menuconfig APPLICATION_SENSOR_CH4 bool "Using sensor CH4 apps" default n diff --git a/APP_Framework/Applications/sensor_app/Makefile b/APP_Framework/Applications/sensor_app/Makefile index 63b624505..832a15126 100644 --- a/APP_Framework/Applications/sensor_app/Makefile +++ b/APP_Framework/Applications/sensor_app/Makefile @@ -1,5 +1,9 @@ SRC_FILES := +ifeq ($(CONFIG_APPLICATION_SENSOR_IAQ_TB600B_IAQ10), y) + SRC_FILES += iaq_tb600b_iaq10.c +endif + ifeq ($(CONFIG_APPLICATION_SENSOR_CH4_AS830), y) SRC_FILES += ch4_as830.c endif diff --git a/APP_Framework/Applications/sensor_app/iaq_tb600b_iaq10.c b/APP_Framework/Applications/sensor_app/iaq_tb600b_iaq10.c new file mode 100644 index 000000000..a3466f165 --- /dev/null +++ b/APP_Framework/Applications/sensor_app/iaq_tb600b_iaq10.c @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file iaq_tb600b_iaq10.c + * @brief iaq10 example + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.14 + */ + +#include +#include + +// struct iaq_data { +// uint16_t gas; +// uint8_t TH; +// uint8_t TL; +// uint8_t RhH; +// uint8_t RhL; +// }; +/** + * @description: Read a iaq + * @return 0 + */ +void IaqTb600bIaq10(void) +{ + struct SensorQuantity *iaq = SensorQuantityFind(SENSOR_QUANTITY_TB600B_IAQ, SENSOR_QUANTITY_IAQ); + SensorQuantityOpen(iaq); + int32_t result = 0; + + result = SensorQuantityRead(iaq); + + printf("Gas concentration is : %dppb\n", result); + SensorQuantityClose(iaq); +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/Kconfig b/APP_Framework/Framework/sensor/Kconfig index 669c26cd2..334eb3f65 100644 --- a/APP_Framework/Framework/sensor/Kconfig +++ b/APP_Framework/Framework/sensor/Kconfig @@ -4,6 +4,13 @@ menuconfig SUPPORT_SENSOR_FRAMEWORK select TRANSFORM_LAYER_ATTRIUBUTE if SUPPORT_SENSOR_FRAMEWORK + menuconfig SENSOR_IAQ + bool "Using IAQ sensor device" + default n + if SENSOR_IAQ + source "$APP_DIR/Framework/sensor/iaq/Kconfig" + endif + menuconfig SENSOR_CH4 bool "Using Ch4 sensor device" default n diff --git a/APP_Framework/Framework/sensor/Makefile b/APP_Framework/Framework/sensor/Makefile index d8cdf1418..8dc31ead9 100644 --- a/APP_Framework/Framework/sensor/Makefile +++ b/APP_Framework/Framework/sensor/Makefile @@ -1,5 +1,9 @@ SRC_FILES := sensor.c +ifeq ($(CONFIG_SENSOR_IAQ),y) + SRC_DIR += iaq +endif + ifeq ($(CONFIG_SENSOR_CH4),y) SRC_DIR += ch4 endif diff --git a/APP_Framework/Framework/sensor/iaq/Kconfig b/APP_Framework/Framework/sensor/iaq/Kconfig new file mode 100644 index 000000000..8d258f05b --- /dev/null +++ b/APP_Framework/Framework/sensor/iaq/Kconfig @@ -0,0 +1,43 @@ + +config SENSOR_TB600B_IAQ10 + bool "Using TB600B IAQ10" + default n + + if SENSOR_TB600B_IAQ10 + config SENSOR_DEVICE_TB600B_IAQ10 + string "tb600b iaq10 sensor name" + default "tb600b_iaq10_1" + + config SENSOR_QUANTITY_TB600B_IAQ + string "tb600b iaq10 quantity name" + default "iaq_1" + + if ADD_XIUOS_FETURES + config SENSOR_TB600B_IAQ10_DRIVER_EXTUART + bool "Using extra uart to support tb600b iaq10" + default y + + config SENSOR_DEVICE_TB600B_IAQ10_DEV + string "tb600b iaq10 device uart path" + default "/dev/uart2_dev2" + depends on !SENSOR_TB600B_IAQ10_DRIVER_EXTUART + + if SENSOR_TB600B_IAQ10_DRIVER_EXTUART + config SENSOR_DEVICE_TB600B_IAQ10_DEV + string "tb600b iaq10 device extra uart path" + default "/dev/extuart_dev5" + + config SENSOR_DEVICE_TB600B_IAQ10_DEV_EXT_PORT + int "if TB600B_IAQ10 device using extuart, choose port" + default "5" + endif + endif + + if ADD_NUTTX_FETURES + + endif + + if ADD_RTTHREAD_FETURES + + endif + endif diff --git a/APP_Framework/Framework/sensor/iaq/Makefile b/APP_Framework/Framework/sensor/iaq/Makefile new file mode 100644 index 000000000..775a2d288 --- /dev/null +++ b/APP_Framework/Framework/sensor/iaq/Makefile @@ -0,0 +1,5 @@ +ifeq ($(CONFIG_SENSOR_TB600B_IAQ10),y) + SRC_DIR += tb600b_iaq10 +endif + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/Makefile b/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/Makefile new file mode 100644 index 000000000..dff84d47a --- /dev/null +++ b/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := tb600b_iaq10.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c b/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c new file mode 100644 index 000000000..3fade7633 --- /dev/null +++ b/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c @@ -0,0 +1,235 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file tb600b_iaq10.c + * @brief tb600b_iaq10 driver base sensor + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.14 + */ + +#include + +static struct SensorDevice tb600b_iaq10; +static uint8_t ReadInstruction[9]; + +struct iaq_data { + uint16_t gas; + uint8_t TH; + uint8_t TL; + uint8_t RhH; + uint8_t RhL; +}; + +static struct SensorProductInfo info = +{ + SENSOR_ABILITY_IAQ, + "AQS", + "TB600B_IAQ10", +}; + +/** + * @description: Open AS830 sensor device + * @param sdev - sensor device pointer + * @return success: 1 , failure: other + */ +static int SensorDeviceOpen(struct SensorDevice *sdev) +{ + int result = 0; + + sdev->fd = PrivOpen(SENSOR_DEVICE_TB600B_IAQ10_DEV, O_RDWR); + if (sdev->fd < 0) { + printf("open %s error\n", SENSOR_DEVICE_TB600B_IAQ10_DEV); + return -1; + } + + struct SerialDataCfg cfg; + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_buffer_size = 128; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = 0; + cfg.serial_invert_mode = 0; +#ifdef SENSOR_TB600B_IAQ10_DRIVER_EXTUART + cfg.ext_uart_no = SENSOR_DEVICE_TB600B_IAQ10_DEV_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg); + + return result; +} + +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceRead(struct SensorDevice *sdev, size_t len) +{ + uint8_t tmp = 0; + uint8_t idx = 0; + int32_t ret = 0; + + /* this instruction will read gas with temperature and humidity,return 13 datas*/ + ReadInstruction[0] = 0xFF; + ReadInstruction[1] = 0x01; + ReadInstruction[2] = 0x87; + ReadInstruction[3] = 0x00; + ReadInstruction[4] = 0x00; + ReadInstruction[5] = 0x00; + ReadInstruction[6] = 0x00; + ReadInstruction[7] = 0x00; + ReadInstruction[8] = 0x78; + + PrivWrite(sdev->fd, ReadInstruction, 9); + + for(idx = 0; idx < 13; idx++) + { + if (PrivRead(sdev->fd, &tmp, 1) == 1) { + sdev->buffer[idx] = tmp; + } + } + + return idx; +} +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceWrite(struct SensorDevice *sdev, const void *buf, size_t len) +{ + return PrivWrite(sdev->fd, buf, len); + +} + +static struct SensorDone done = +{ + SensorDeviceOpen, + NULL, + SensorDeviceRead, + SensorDeviceWrite, + NULL, +}; + +/** + * @description: Init AS830 sensor and register + * @return void + */ +static void SensorDeviceTb600bIaq10Init(void) +{ + tb600b_iaq10.name = SENSOR_DEVICE_TB600B_IAQ10; + tb600b_iaq10.info = &info; + tb600b_iaq10.done = &done; + + SensorDeviceRegister(&tb600b_iaq10); +} + +static struct SensorQuantity tb600b_iaq10_iaq; + +/* check data*/ +static uint8_t getCheckSum(uint8_t *packet) +{ + uint8_t i; + uint8_t checksum = 0; + for( i = 1; i < 12; i++) + { + checksum += packet[i]; + } + checksum = ~checksum + 1; + + return checksum; +} + +/** + * @description: Analysis AS830 CH4 result + * @param quant - sensor quantity pointer + * @return quantity value + */ +static int32_t QuantityRead(struct SensorQuantity *quant) +{ + if (!quant) + return -1; + + uint32_t len = 0; + uint8_t checksum = 0; + uint8_t TH, TL, RhH, RhL; + uint16_t gas; + struct iaq_data result; + + if (quant->sdev->done->read != NULL) { + if(quant->sdev->status == SENSOR_DEVICE_PASSIVE) { + len = quant->sdev->done->read(quant->sdev, 13); + if (len == 0) + { + printf("error read data length = 0.\n"); + return -1; + } + checksum = getCheckSum(quant->sdev->buffer); + if(checksum == quant->sdev->buffer[12]) + { + result.gas = (uint16_t)quant->sdev->buffer[6] * 256 + (uint16)quant->sdev->buffer[7]; + result.TH = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))/100; + result.TL = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))%100; + result.RhH = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))/100; + result.RhL = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))%100; + printf("Gas concentration is : %dppb\nThe temperature is : %d.%d℃\nThe humidity is : %d.%drh%%\n", result.gas, result.TH, result.TL, result.RhH, result.RhL); + return result.gas; + } + else + { + printf("This reading is wrong\n"); + return SENSOR_QUANTITY_VALUE_ERROR; + } + } + if (quant->sdev->status == SENSOR_DEVICE_ACTIVE) + { + printf("Please set passive mode.\n"); + } + }else{ + printf("%s don't have read done.\n", quant->name); + } + + return -1; +} + +/** + * @description: Init AS830 CH4 quantity and register + * @return 0 + */ +int Tb600bIaq10IaqInit(void) +{ + SensorDeviceTb600bIaq10Init(); + + tb600b_iaq10_iaq.name = SENSOR_QUANTITY_TB600B_IAQ; + tb600b_iaq10_iaq.type = SENSOR_QUANTITY_IAQ; + tb600b_iaq10_iaq.value.decimal_places = 0; + tb600b_iaq10_iaq.value.max_std = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_iaq10_iaq.value.min_std = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_iaq10_iaq.value.last_value = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_iaq10_iaq.value.max_value = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_iaq10_iaq.value.min_value = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_iaq10_iaq.sdev = &tb600b_iaq10; + tb600b_iaq10_iaq.ReadValue = QuantityRead; + + SensorQuantityRegister(&tb600b_iaq10_iaq); + + return 0; +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/sensor.h b/APP_Framework/Framework/sensor/sensor.h index a9bcecbc1..96edfd275 100644 --- a/APP_Framework/Framework/sensor/sensor.h +++ b/APP_Framework/Framework/sensor/sensor.h @@ -52,6 +52,7 @@ extern "C" { #define SENSOR_ABILITY_PM ((uint32_t)(1 << SENSOR_QUANTITY_PM)) #define SENSOR_ABILITY_VOICE ((uint32_t)(1 << SENSOR_QUANTITY_VOICE)) #define SENSOR_ABILITY_CH4 ((uint32_t)(1 << SENSOR_QUANTITY_CH4)) +#define SENSOR_ABILITY_IAQ ((uint32_t)(1 << SENSOR_QUANTITY_IAQ)) struct SensorProductInfo { uint32_t ability; /* Bitwise OR of sensor ability */ @@ -91,6 +92,7 @@ enum SensorQuantityType { SENSOR_QUANTITY_PM, SENSOR_QUANTITY_VOICE, SENSOR_QUANTITY_CH4, + SENSOR_QUANTITY_IAQ, /* ...... */ SENSOR_QUANTITY_END, }; From 19edea21d7cd2d02b116e5441bc5e4a8cc154dd7 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Wed, 15 Dec 2021 15:01:30 +0800 Subject: [PATCH 5/6] add 'TB600B_TVOC10' sensor of tvoc to sensor framework --- APP_Framework/Applications/framework_init.c | 5 + APP_Framework/Applications/sensor_app/Kconfig | 10 + .../Applications/sensor_app/Makefile | 4 + .../sensor_app/tvoc_tb600b_tvoc10.c | 39 +++ APP_Framework/Framework/sensor/Kconfig | 7 + APP_Framework/Framework/sensor/Makefile | 4 + .../sensor/iaq/tb600b_iaq10/tb600b_iaq10.c | 10 +- APP_Framework/Framework/sensor/sensor.h | 2 + APP_Framework/Framework/sensor/tvoc/Kconfig | 43 ++++ APP_Framework/Framework/sensor/tvoc/Makefile | 5 + .../sensor/tvoc/tb600b_tvoc10/Makefile | 3 + .../sensor/tvoc/tb600b_tvoc10/tb600b_tvoc10.c | 227 ++++++++++++++++++ 12 files changed, 354 insertions(+), 5 deletions(-) create mode 100644 APP_Framework/Applications/sensor_app/tvoc_tb600b_tvoc10.c create mode 100644 APP_Framework/Framework/sensor/tvoc/Kconfig create mode 100644 APP_Framework/Framework/sensor/tvoc/Makefile create mode 100644 APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/Makefile create mode 100644 APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/tb600b_tvoc10.c diff --git a/APP_Framework/Applications/framework_init.c b/APP_Framework/Applications/framework_init.c index be2cfbb98..6ba1d6978 100644 --- a/APP_Framework/Applications/framework_init.c +++ b/APP_Framework/Applications/framework_init.c @@ -31,6 +31,7 @@ extern int Ps5308Pm1_0Init(void); extern int Zg09Co2Init(void); extern int As830Ch4Init(void); extern int Tb600bIaq10IaqInit(void); +extern int Tb600bTvoc10TvocInit(void); typedef int (*InitFunc)(void); struct InitDesc @@ -99,6 +100,10 @@ static struct InitDesc sensor_desc[] = { "iaq_tb600b_iaq10", Tb600bIaq10IaqInit }, #endif +#ifdef SENSOR_TB600B_TVOC10 + { "tvoc_tb600b_tvoc10", Tb600bTvoc10TvocInit }, +#endif + { "NULL", NULL }, }; diff --git a/APP_Framework/Applications/sensor_app/Kconfig b/APP_Framework/Applications/sensor_app/Kconfig index ad47611d0..9dafba604 100755 --- a/APP_Framework/Applications/sensor_app/Kconfig +++ b/APP_Framework/Applications/sensor_app/Kconfig @@ -5,6 +5,16 @@ menu "sensor app" default n if APPLICATION_SENSOR + menuconfig APPLICATION_SENSOR_TVOC + bool "Using sensor TVOC apps" + default n + + if APPLICATION_SENSOR_TVOC + config APPLICATION_SENSOR_TVOC_TB600B_TVOC10 + bool "Using sensor TB600B_TVOC10 apps" + default n + endif + menuconfig APPLICATION_SENSOR_IAQ bool "Using sensor IAQ apps" default n diff --git a/APP_Framework/Applications/sensor_app/Makefile b/APP_Framework/Applications/sensor_app/Makefile index 832a15126..d457b729a 100644 --- a/APP_Framework/Applications/sensor_app/Makefile +++ b/APP_Framework/Applications/sensor_app/Makefile @@ -1,5 +1,9 @@ SRC_FILES := +ifeq ($(CONFIG_APPLICATION_SENSOR_TVOC_TB600B_TVOC10), y) + SRC_FILES += tvoc_tb600b_tvoc10.c +endif + ifeq ($(CONFIG_APPLICATION_SENSOR_IAQ_TB600B_IAQ10), y) SRC_FILES += iaq_tb600b_iaq10.c endif diff --git a/APP_Framework/Applications/sensor_app/tvoc_tb600b_tvoc10.c b/APP_Framework/Applications/sensor_app/tvoc_tb600b_tvoc10.c new file mode 100644 index 000000000..6787717d7 --- /dev/null +++ b/APP_Framework/Applications/sensor_app/tvoc_tb600b_tvoc10.c @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file tvoc_tb600b_tvoc10.c + * @brief tvoc10 example + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.15 + */ + +#include +#include + + +/** + * @description: Read a tvoc + * @return 0 + */ +void TvocTb600bTvoc10(void) +{ + struct SensorQuantity *tvoc = SensorQuantityFind(SENSOR_QUANTITY_TB600B_TVOC, SENSOR_QUANTITY_TVOC); + SensorQuantityOpen(tvoc); + int32_t result = 0; + + result = SensorQuantityRead(tvoc); + + printf("tvoc concentration is : %dppb\n", result); + SensorQuantityClose(tvoc); +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/Kconfig b/APP_Framework/Framework/sensor/Kconfig index 334eb3f65..f65b6cc68 100644 --- a/APP_Framework/Framework/sensor/Kconfig +++ b/APP_Framework/Framework/sensor/Kconfig @@ -4,6 +4,13 @@ menuconfig SUPPORT_SENSOR_FRAMEWORK select TRANSFORM_LAYER_ATTRIUBUTE if SUPPORT_SENSOR_FRAMEWORK + menuconfig SENSOR_TVOC + bool "Using TVOC sensor device" + default n + if SENSOR_TVOC + source "$APP_DIR/Framework/sensor/tvoc/Kconfig" + endif + menuconfig SENSOR_IAQ bool "Using IAQ sensor device" default n diff --git a/APP_Framework/Framework/sensor/Makefile b/APP_Framework/Framework/sensor/Makefile index 8dc31ead9..c1764df68 100644 --- a/APP_Framework/Framework/sensor/Makefile +++ b/APP_Framework/Framework/sensor/Makefile @@ -1,5 +1,9 @@ SRC_FILES := sensor.c +ifeq ($(CONFIG_SENSOR_TVOC),y) + SRC_DIR += tvoc +endif + ifeq ($(CONFIG_SENSOR_IAQ),y) SRC_DIR += iaq endif diff --git a/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c b/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c index 3fade7633..2760efe28 100644 --- a/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c +++ b/APP_Framework/Framework/sensor/iaq/tb600b_iaq10/tb600b_iaq10.c @@ -39,7 +39,7 @@ static struct SensorProductInfo info = }; /** - * @description: Open AS830 sensor device + * @description: Open tb600b_iaq10 sensor device * @param sdev - sensor device pointer * @return success: 1 , failure: other */ @@ -130,7 +130,7 @@ static struct SensorDone done = }; /** - * @description: Init AS830 sensor and register + * @description: Init tb600b_iaq10 sensor and register * @return void */ static void SensorDeviceTb600bIaq10Init(void) @@ -159,7 +159,7 @@ static uint8_t getCheckSum(uint8_t *packet) } /** - * @description: Analysis AS830 CH4 result + * @description: Analysis tb600b_iaq10 result * @param quant - sensor quantity pointer * @return quantity value */ @@ -185,7 +185,7 @@ static int32_t QuantityRead(struct SensorQuantity *quant) checksum = getCheckSum(quant->sdev->buffer); if(checksum == quant->sdev->buffer[12]) { - result.gas = (uint16_t)quant->sdev->buffer[6] * 256 + (uint16)quant->sdev->buffer[7]; + result.gas = (uint16_t)quant->sdev->buffer[6] * 256 + (uint16_t)quant->sdev->buffer[7]; result.TH = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))/100; result.TL = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))%100; result.RhH = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))/100; @@ -211,7 +211,7 @@ static int32_t QuantityRead(struct SensorQuantity *quant) } /** - * @description: Init AS830 CH4 quantity and register + * @description: Init tb600b_iaq10 quantity and register * @return 0 */ int Tb600bIaq10IaqInit(void) diff --git a/APP_Framework/Framework/sensor/sensor.h b/APP_Framework/Framework/sensor/sensor.h index 96edfd275..1da734c7c 100644 --- a/APP_Framework/Framework/sensor/sensor.h +++ b/APP_Framework/Framework/sensor/sensor.h @@ -53,6 +53,7 @@ extern "C" { #define SENSOR_ABILITY_VOICE ((uint32_t)(1 << SENSOR_QUANTITY_VOICE)) #define SENSOR_ABILITY_CH4 ((uint32_t)(1 << SENSOR_QUANTITY_CH4)) #define SENSOR_ABILITY_IAQ ((uint32_t)(1 << SENSOR_QUANTITY_IAQ)) +#define SENSOR_ABILITY_TVOC ((uint32_t)(1 << SENSOR_QUANTITY_TVOC)) struct SensorProductInfo { uint32_t ability; /* Bitwise OR of sensor ability */ @@ -93,6 +94,7 @@ enum SensorQuantityType { SENSOR_QUANTITY_VOICE, SENSOR_QUANTITY_CH4, SENSOR_QUANTITY_IAQ, + SENSOR_QUANTITY_TVOC, /* ...... */ SENSOR_QUANTITY_END, }; diff --git a/APP_Framework/Framework/sensor/tvoc/Kconfig b/APP_Framework/Framework/sensor/tvoc/Kconfig new file mode 100644 index 000000000..8d069425d --- /dev/null +++ b/APP_Framework/Framework/sensor/tvoc/Kconfig @@ -0,0 +1,43 @@ + +config SENSOR_TB600B_TVOC10 + bool "Using TB600B TVOC10" + default n + + if SENSOR_TB600B_TVOC10 + config SENSOR_DEVICE_TB600B_TVOC10 + string "tb600b tvoc10 sensor name" + default "tb600b_tvoc10_1" + + config SENSOR_QUANTITY_TB600B_TVOC + string "tb600b tvoc10 quantity name" + default "tvoc_1" + + if ADD_XIUOS_FETURES + config SENSOR_TB600B_TVOC10_DRIVER_EXTUART + bool "Using extra uart to support tb600b tvoc10" + default y + + config SENSOR_DEVICE_TB600B_TVOC10_DEV + string "tb600b tvoc10 device uart path" + default "/dev/uart2_dev2" + depends on !SENSOR_TB600B_TVOC10_DRIVER_EXTUART + + if SENSOR_TB600B_TVOC10_DRIVER_EXTUART + config SENSOR_DEVICE_TB600B_TVOC10_DEV + string "tb600b tvoc10 device extra uart path" + default "/dev/extuart_dev6" + + config SENSOR_DEVICE_TB600B_TVOC10_DEV_EXT_PORT + int "if TB600B_TVOC10 device using extuart, choose port" + default "6" + endif + endif + + if ADD_NUTTX_FETURES + + endif + + if ADD_RTTHREAD_FETURES + + endif + endif diff --git a/APP_Framework/Framework/sensor/tvoc/Makefile b/APP_Framework/Framework/sensor/tvoc/Makefile new file mode 100644 index 000000000..8ef12bb44 --- /dev/null +++ b/APP_Framework/Framework/sensor/tvoc/Makefile @@ -0,0 +1,5 @@ +ifeq ($(CONFIG_SENSOR_TB600B_TVOC10),y) + SRC_DIR += tb600b_tvoc10 +endif + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/Makefile b/APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/Makefile new file mode 100644 index 000000000..6dbfd41f2 --- /dev/null +++ b/APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := tb600b_tvoc10.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/tb600b_tvoc10.c b/APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/tb600b_tvoc10.c new file mode 100644 index 000000000..ace49c577 --- /dev/null +++ b/APP_Framework/Framework/sensor/tvoc/tb600b_tvoc10/tb600b_tvoc10.c @@ -0,0 +1,227 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file tb600b_tvoc10.c + * @brief tb600b_tvoc10 driver base sensor + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.15 + */ + +#include + +static struct SensorDevice tb600b_tvoc10; +static uint8_t ReadInstruction[9]; + +static struct SensorProductInfo info = +{ + SENSOR_ABILITY_TVOC, + "AQS", + "TB600B_TVOC10", +}; + +/** + * @description: Open TB600B TVOC10 sensor device + * @param sdev - sensor device pointer + * @return success: 1 , failure: other + */ +static int SensorDeviceOpen(struct SensorDevice *sdev) +{ + int result = 0; + + sdev->fd = PrivOpen(SENSOR_DEVICE_TB600B_TVOC10_DEV, O_RDWR); + if (sdev->fd < 0) { + printf("open %s error\n", SENSOR_DEVICE_TB600B_TVOC10_DEV); + return -1; + } + + struct SerialDataCfg cfg; + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_buffer_size = 128; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = 0; + cfg.serial_invert_mode = 0; +#ifdef SENSOR_TB600B_TVOC10_DRIVER_EXTUART + cfg.ext_uart_no = SENSOR_DEVICE_TB600B_TVOC10_DEV_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg); + + return result; +} + +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceRead(struct SensorDevice *sdev, size_t len) +{ + uint8_t tmp = 0; + uint8_t idx = 0; + + /* this instruction will read gas with temperature and humidity,return 13 datas*/ + ReadInstruction[0] = 0xFF; + ReadInstruction[1] = 0x01; + ReadInstruction[2] = 0x87; + ReadInstruction[3] = 0x00; + ReadInstruction[4] = 0x00; + ReadInstruction[5] = 0x00; + ReadInstruction[6] = 0x00; + ReadInstruction[7] = 0x00; + ReadInstruction[8] = 0x78; + + PrivWrite(sdev->fd, ReadInstruction, 9); + + for(idx = 0; idx < 13; idx++) + { + if (PrivRead(sdev->fd, &tmp, 1) == 1) { + sdev->buffer[idx] = tmp; + } + } + + return idx; +} +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceWrite(struct SensorDevice *sdev, const void *buf, size_t len) +{ + return PrivWrite(sdev->fd, buf, len); + +} + +static struct SensorDone done = +{ + SensorDeviceOpen, + NULL, + SensorDeviceRead, + SensorDeviceWrite, + NULL, +}; + +/** + * @description: Init TB600B TVOC10 sensor and register + * @return void + */ +static void SensorDeviceTb600bTvoc10Init(void) +{ + tb600b_tvoc10.name = SENSOR_DEVICE_TB600B_TVOC10; + tb600b_tvoc10.info = &info; + tb600b_tvoc10.done = &done; + + SensorDeviceRegister(&tb600b_tvoc10); +} + +static struct SensorQuantity tb600b_tvoc10_tvoc; + +/* check data*/ +static uint8_t getCheckSum(uint8_t *packet) +{ + uint8_t i; + uint8_t checksum = 0; + for( i = 1; i < 12; i++) + { + checksum += packet[i]; + } + checksum = ~checksum + 1; + + return checksum; +} + +/** + * @description: Analysis TB600B TVOC10 result + * @param quant - sensor quantity pointer + * @return quantity value + */ +static int32_t QuantityRead(struct SensorQuantity *quant) +{ + if (!quant) + return -1; + + uint32_t len = 0; + uint8_t checksum = 0; + uint8_t TH, TL, RhH, RhL; + uint16_t ppb, ugm3; + + if (quant->sdev->done->read != NULL) { + if(quant->sdev->status == SENSOR_DEVICE_PASSIVE) { + len = quant->sdev->done->read(quant->sdev, 13); + if (len == 0) + { + printf("error read data length = 0.\n"); + return -1; + } + checksum = getCheckSum(quant->sdev->buffer); + if(checksum == quant->sdev->buffer[12]) + { + ugm3 = (uint16_t)quant->sdev->buffer[2] * 256 + (uint16_t)quant->sdev->buffer[3]; + ppb = (uint16_t)quant->sdev->buffer[6] * 256 + (uint16_t)quant->sdev->buffer[7]; + TH = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))/100; + TL = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))%100; + RhH = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))/100; + RhL = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))%100; + + printf("tvoc concentration is : %dug/m³(%dppb)\nThe temperature is : %d.%d℃\nThe humidity is : %d.%drh%%\n", ugm3, ppb, TH, TL, RhH, RhL); + return ppb; + } + else + { + printf("This reading is wrong\n"); + return SENSOR_QUANTITY_VALUE_ERROR; + } + } + if (quant->sdev->status == SENSOR_DEVICE_ACTIVE) + { + printf("Please set passive mode.\n"); + } + }else{ + printf("%s don't have read done.\n", quant->name); + } + + return -1; +} + +/** + * @description: Init TB600B TVOC10 quantity and register + * @return 0 + */ +int Tb600bTvoc10TvocInit(void) +{ + SensorDeviceTb600bTvoc10Init(); + + tb600b_tvoc10_tvoc.name = SENSOR_QUANTITY_TB600B_TVOC; + tb600b_tvoc10_tvoc.type = SENSOR_QUANTITY_TVOC; + tb600b_tvoc10_tvoc.value.decimal_places = 0; + tb600b_tvoc10_tvoc.value.max_std = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_tvoc10_tvoc.value.min_std = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_tvoc10_tvoc.value.last_value = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_tvoc10_tvoc.value.max_value = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_tvoc10_tvoc.value.min_value = SENSOR_QUANTITY_VALUE_ERROR; + tb600b_tvoc10_tvoc.sdev = &tb600b_tvoc10; + tb600b_tvoc10_tvoc.ReadValue = QuantityRead; + + SensorQuantityRegister(&tb600b_tvoc10_tvoc); + + return 0; +} \ No newline at end of file From db225df4334008707422f4ac16ebc0b77bf8114b Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Wed, 15 Dec 2021 16:28:51 +0800 Subject: [PATCH 6/6] add 'TB600B_WQ_HCHO1OS' sensor of hcho to sensor framework --- APP_Framework/Applications/framework_init.c | 5 + APP_Framework/Applications/sensor_app/Kconfig | 10 + .../Applications/sensor_app/Makefile | 4 + .../sensor_app/hcho_tb600b_wq_hcho1os.c | 39 +++ APP_Framework/Framework/sensor/Kconfig | 7 + APP_Framework/Framework/sensor/Makefile | 4 + APP_Framework/Framework/sensor/hcho/Kconfig | 43 ++++ APP_Framework/Framework/sensor/hcho/Makefile | 5 + .../sensor/hcho/tb600b_wq_hcho1os/Makefile | 3 + .../tb600b_wq_hcho1os/tb600b_wq_hcho1os.c | 222 ++++++++++++++++++ APP_Framework/Framework/sensor/sensor.h | 1 + 11 files changed, 343 insertions(+) create mode 100644 APP_Framework/Applications/sensor_app/hcho_tb600b_wq_hcho1os.c create mode 100644 APP_Framework/Framework/sensor/hcho/Kconfig create mode 100644 APP_Framework/Framework/sensor/hcho/Makefile create mode 100644 APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/Makefile create mode 100644 APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/tb600b_wq_hcho1os.c diff --git a/APP_Framework/Applications/framework_init.c b/APP_Framework/Applications/framework_init.c index 6ba1d6978..603af2fac 100644 --- a/APP_Framework/Applications/framework_init.c +++ b/APP_Framework/Applications/framework_init.c @@ -32,6 +32,7 @@ extern int Zg09Co2Init(void); extern int As830Ch4Init(void); extern int Tb600bIaq10IaqInit(void); extern int Tb600bTvoc10TvocInit(void); +extern int Tb600bWqHcho1osInit(void); typedef int (*InitFunc)(void); struct InitDesc @@ -104,6 +105,10 @@ static struct InitDesc sensor_desc[] = { "tvoc_tb600b_tvoc10", Tb600bTvoc10TvocInit }, #endif +#ifdef SENSOR_TB600B_WQ_HCHO1OS + { "tvoc_tb600b_wq_hcho1os", Tb600bWqHcho1osInit }, +#endif + { "NULL", NULL }, }; diff --git a/APP_Framework/Applications/sensor_app/Kconfig b/APP_Framework/Applications/sensor_app/Kconfig index 9dafba604..67474d37c 100755 --- a/APP_Framework/Applications/sensor_app/Kconfig +++ b/APP_Framework/Applications/sensor_app/Kconfig @@ -5,6 +5,16 @@ menu "sensor app" default n if APPLICATION_SENSOR + menuconfig APPLICATION_SENSOR_HCHO + bool "Using sensor HCHO apps" + default n + + if APPLICATION_SENSOR_HCHO + config APPLICATION_SENSOR_HCHO_TB600B_WQ_HCHO1OS + bool "Using sensor TB600B_WQ_HCHO1OS apps" + default n + endif + menuconfig APPLICATION_SENSOR_TVOC bool "Using sensor TVOC apps" default n diff --git a/APP_Framework/Applications/sensor_app/Makefile b/APP_Framework/Applications/sensor_app/Makefile index d457b729a..7a067414b 100644 --- a/APP_Framework/Applications/sensor_app/Makefile +++ b/APP_Framework/Applications/sensor_app/Makefile @@ -1,5 +1,9 @@ SRC_FILES := +ifeq ($(CONFIG_APPLICATION_SENSOR_HCHO_TB600B_WQ_HCHO1OS), y) + SRC_FILES += hcho_tb600b_wq_hcho1os.c +endif + ifeq ($(CONFIG_APPLICATION_SENSOR_TVOC_TB600B_TVOC10), y) SRC_FILES += tvoc_tb600b_tvoc10.c endif diff --git a/APP_Framework/Applications/sensor_app/hcho_tb600b_wq_hcho1os.c b/APP_Framework/Applications/sensor_app/hcho_tb600b_wq_hcho1os.c new file mode 100644 index 000000000..09e2b7858 --- /dev/null +++ b/APP_Framework/Applications/sensor_app/hcho_tb600b_wq_hcho1os.c @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file hcho_tb600b_wq_hcho1os.c + * @brief hcho example + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.15 + */ + +#include +#include + + +/** + * @description: Read a hcho + * @return 0 + */ +void HchoTb600bHcho1os(void) +{ + struct SensorQuantity *hcho = SensorQuantityFind(SENSOR_QUANTITY_TB600B_HCHO, SENSOR_QUANTITY_HCHO); + SensorQuantityOpen(hcho); + int32_t result = 0; + + result = SensorQuantityRead(hcho); + + printf("tvoc concentration is : %dppb\n", result); + SensorQuantityClose(hcho); +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/Kconfig b/APP_Framework/Framework/sensor/Kconfig index f65b6cc68..69ea74471 100644 --- a/APP_Framework/Framework/sensor/Kconfig +++ b/APP_Framework/Framework/sensor/Kconfig @@ -4,6 +4,13 @@ menuconfig SUPPORT_SENSOR_FRAMEWORK select TRANSFORM_LAYER_ATTRIUBUTE if SUPPORT_SENSOR_FRAMEWORK + menuconfig SENSOR_HCHO + bool "Using HCHO sensor device" + default n + if SENSOR_HCHO + source "$APP_DIR/Framework/sensor/hcho/Kconfig" + endif + menuconfig SENSOR_TVOC bool "Using TVOC sensor device" default n diff --git a/APP_Framework/Framework/sensor/Makefile b/APP_Framework/Framework/sensor/Makefile index c1764df68..9f19136de 100644 --- a/APP_Framework/Framework/sensor/Makefile +++ b/APP_Framework/Framework/sensor/Makefile @@ -1,5 +1,9 @@ SRC_FILES := sensor.c +ifeq ($(CONFIG_SENSOR_HCHO),y) + SRC_DIR += hcho +endif + ifeq ($(CONFIG_SENSOR_TVOC),y) SRC_DIR += tvoc endif diff --git a/APP_Framework/Framework/sensor/hcho/Kconfig b/APP_Framework/Framework/sensor/hcho/Kconfig new file mode 100644 index 000000000..0b5ad82dd --- /dev/null +++ b/APP_Framework/Framework/sensor/hcho/Kconfig @@ -0,0 +1,43 @@ + +config SENSOR_TB600B_WQ_HCHO1OS + bool "Using TB600B WQ_HCHO1OS" + default n + + if SENSOR_TB600B_WQ_HCHO1OS + config SENSOR_DEVICE_TB600B_WQ_HCHO1OS + string "tb600b wq_hcho1os sensor name" + default "tb600b_wq_hcho1os_1" + + config SENSOR_QUANTITY_TB600B_HCHO + string "tb600b wq_hcho1os quantity name" + default "hcho_1" + + if ADD_XIUOS_FETURES + config SENSOR_TB600B_WQ_HCHO1OS_DRIVER_EXTUART + bool "Using extra uart to support tb600b wq_hcho1os" + default y + + config SENSOR_DEVICE_TB600B_WQ_HCHO1OS_DEV + string "tb600b wq_hcho1os device uart path" + default "/dev/uart2_dev2" + depends on !SENSOR_TB600B_WQ_HCHO1OS_DRIVER_EXTUART + + if SENSOR_TB600B_WQ_HCHO1OS_DRIVER_EXTUART + config SENSOR_DEVICE_TB600B_WQ_HCHO1OS_DEV + string "tb600b wq_hcho1os device extra uart path" + default "/dev/extuart_dev5" + + config SENSOR_DEVICE_TB600B_WQ_HCHO1OS_DEV_EXT_PORT + int "if TB600B_WQ_HCHO1OS device using extuart, choose port" + default "5" + endif + endif + + if ADD_NUTTX_FETURES + + endif + + if ADD_RTTHREAD_FETURES + + endif + endif diff --git a/APP_Framework/Framework/sensor/hcho/Makefile b/APP_Framework/Framework/sensor/hcho/Makefile new file mode 100644 index 000000000..c30211f6c --- /dev/null +++ b/APP_Framework/Framework/sensor/hcho/Makefile @@ -0,0 +1,5 @@ +ifeq ($(CONFIG_SENSOR_TB600B_WQ_HCHO1OS),y) + SRC_DIR += tb600b_wq_hcho1os +endif + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/Makefile b/APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/Makefile new file mode 100644 index 000000000..3dec9399d --- /dev/null +++ b/APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := tb600b_wq_hcho1os.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/tb600b_wq_hcho1os.c b/APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/tb600b_wq_hcho1os.c new file mode 100644 index 000000000..96ede2fc9 --- /dev/null +++ b/APP_Framework/Framework/sensor/hcho/tb600b_wq_hcho1os/tb600b_wq_hcho1os.c @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file wq_hcho1os.c + * @brief wq_hcho1os driver base sensor + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021.12.15 + */ + +#include + +static struct SensorDevice wq_hcho1os; +static uint8_t ReadInstruction[9]; + +static struct SensorProductInfo info = +{ + SENSOR_ABILITY_HCHO, + "AQS", + "TB600B_WQ_HCHO1OS", +}; + +/** + * @description: Open TB600B WQ_HCHO1OS sensor device + * @param sdev - sensor device pointer + * @return success: 1 , failure: other + */ +static int SensorDeviceOpen(struct SensorDevice *sdev) +{ + int result = 0; + + sdev->fd = PrivOpen(SENSOR_DEVICE_TB600B_WQ_HCHO1OS_DEV, O_RDWR); + if (sdev->fd < 0) { + printf("open %s error\n", SENSOR_DEVICE_TB600B_WQ_HCHO1OS_DEV); + return -1; + } + + struct SerialDataCfg cfg; + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_buffer_size = 128; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = 0; + cfg.serial_invert_mode = 0; +#ifdef SENSOR_TB600B_WQ_HCHO1OS_DRIVER_EXTUART + cfg.ext_uart_no = SENSOR_DEVICE_TB600B_WQ_HCHO1OS_DEV_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg); + + return result; +} + +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceRead(struct SensorDevice *sdev, size_t len) +{ + uint8_t tmp = 0; + uint8_t idx = 0; + + /* this instruction will read gas with temperature and humidity,return 9 datas*/ + ReadInstruction[0] = 0xFF; + ReadInstruction[1] = 0x01; + ReadInstruction[2] = 0x86; + ReadInstruction[3] = 0x00; + ReadInstruction[4] = 0x00; + ReadInstruction[5] = 0x00; + ReadInstruction[6] = 0x00; + ReadInstruction[7] = 0x00; + ReadInstruction[8] = 0x79; + + PrivWrite(sdev->fd, ReadInstruction, 9); + + for(idx = 0; idx < 9; idx++) + { + if (PrivRead(sdev->fd, &tmp, 1) == 1) { + sdev->buffer[idx] = tmp; + } + } + + return idx; +} +/** + * @description: Read sensor device + * @param sdev - sensor device pointer + * @param len - the length of the read data + * @return get data length + */ +static int SensorDeviceWrite(struct SensorDevice *sdev, const void *buf, size_t len) +{ + return PrivWrite(sdev->fd, buf, len); + +} + +static struct SensorDone done = +{ + SensorDeviceOpen, + NULL, + SensorDeviceRead, + SensorDeviceWrite, + NULL, +}; + +/** + * @description: Init TB600B WQ_HCHO1OS sensor and register + * @return void + */ +static void SensorDeviceTb600bHcho1osInit(void) +{ + wq_hcho1os.name = SENSOR_DEVICE_TB600B_WQ_HCHO1OS; + wq_hcho1os.info = &info; + wq_hcho1os.done = &done; + + SensorDeviceRegister(&wq_hcho1os); +} + +static struct SensorQuantity wq_hcho1os_hcho; + +/* check data*/ +static uint8_t getCheckSum(uint8_t *packet) +{ + uint8_t i; + uint8_t checksum = 0; + for( i = 1; i < 12; i++) + { + checksum += packet[i]; + } + checksum = ~checksum + 1; + + return checksum; +} + +/** + * @description: Analysis TB600B WQ_HCHO1OS result + * @param quant - sensor quantity pointer + * @return quantity value + */ +static int32_t QuantityRead(struct SensorQuantity *quant) +{ + if (!quant) + return -1; + + uint32_t len = 0; + uint8_t checksum = 0; + uint16_t ppb, ugm3; + + if (quant->sdev->done->read != NULL) { + if(quant->sdev->status == SENSOR_DEVICE_PASSIVE) { + len = quant->sdev->done->read(quant->sdev, 9); + if (len == 0) + { + printf("error read data length = 0.\n"); + return -1; + } + checksum = getCheckSum(quant->sdev->buffer); + if(checksum == quant->sdev->buffer[8]) + { + ugm3 = (uint16_t)quant->sdev->buffer[2] * 256 + (uint16_t)quant->sdev->buffer[3]; + ppb = (uint16_t)quant->sdev->buffer[6] * 256 + (uint16_t)quant->sdev->buffer[7]; + + printf("Formaldehyde concentration is : %dug/m³(%dppb)\n", ugm3, ppb); + return ppb; + } + else + { + printf("This reading is wrong\n"); + return SENSOR_QUANTITY_VALUE_ERROR; + } + } + if (quant->sdev->status == SENSOR_DEVICE_ACTIVE) + { + printf("Please set passive mode.\n"); + } + }else{ + printf("%s don't have read done.\n", quant->name); + } + + return -1; +} + +/** + * @description: Init TB600B WQ_HCHO1OS quantity and register + * @return 0 + */ +int Tb600bWqHcho1osInit(void) +{ + SensorDeviceTb600bHcho1osInit(); + + wq_hcho1os_hcho.name = SENSOR_QUANTITY_TB600B_HCHO; + wq_hcho1os_hcho.type = SENSOR_QUANTITY_HCHO; + wq_hcho1os_hcho.value.decimal_places = 0; + wq_hcho1os_hcho.value.max_std = SENSOR_QUANTITY_VALUE_ERROR; + wq_hcho1os_hcho.value.min_std = SENSOR_QUANTITY_VALUE_ERROR; + wq_hcho1os_hcho.value.last_value = SENSOR_QUANTITY_VALUE_ERROR; + wq_hcho1os_hcho.value.max_value = SENSOR_QUANTITY_VALUE_ERROR; + wq_hcho1os_hcho.value.min_value = SENSOR_QUANTITY_VALUE_ERROR; + wq_hcho1os_hcho.sdev = &wq_hcho1os; + wq_hcho1os_hcho.ReadValue = QuantityRead; + + SensorQuantityRegister(&wq_hcho1os_hcho); + + return 0; +} \ No newline at end of file diff --git a/APP_Framework/Framework/sensor/sensor.h b/APP_Framework/Framework/sensor/sensor.h index 1da734c7c..fad97fdce 100644 --- a/APP_Framework/Framework/sensor/sensor.h +++ b/APP_Framework/Framework/sensor/sensor.h @@ -54,6 +54,7 @@ extern "C" { #define SENSOR_ABILITY_CH4 ((uint32_t)(1 << SENSOR_QUANTITY_CH4)) #define SENSOR_ABILITY_IAQ ((uint32_t)(1 << SENSOR_QUANTITY_IAQ)) #define SENSOR_ABILITY_TVOC ((uint32_t)(1 << SENSOR_QUANTITY_TVOC)) +#define SENSOR_ABILITY_HCHO ((uint32_t)(1 << SENSOR_QUANTITY_HCHO)) struct SensorProductInfo { uint32_t ability; /* Bitwise OR of sensor ability */