feat: add rust demo
This commit is contained in:
231
examples/tos_meets_rust/BSP/Hardware/PM2D5/pm2d5_parser.c
Normal file
231
examples/tos_meets_rust/BSP/Hardware/PM2D5/pm2d5_parser.c
Normal file
@@ -0,0 +1,231 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* Tencent is pleased to support the open source community by making TencentOS
|
||||
* available.
|
||||
*
|
||||
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
||||
* If you have downloaded a copy of the TencentOS binary from Tencent, please
|
||||
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
|
||||
*
|
||||
* If you have downloaded a copy of the TencentOS source code from Tencent,
|
||||
* please note that TencentOS source code is licensed under the BSD 3-Clause
|
||||
* License, except for the third-party components listed below which are
|
||||
* subject to different license terms. Your integration of TencentOS into your
|
||||
* own projects may require compliance with the BSD 3-Clause License, as well
|
||||
* as the other licenses applicable to the third-party components included
|
||||
* within TencentOS.
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include "pm2d5_parser.h"
|
||||
|
||||
static pm2d5_parser_ctrl_t pm2d5_parser_ctrl;
|
||||
|
||||
static k_stack_t pm2d5_parser_task_stack[PM2D5_PARSER_TASK_STACK_SIZE];
|
||||
|
||||
static uint8_t pm2d5_parser_buffer[PM2D5_PARSER_BUFFER_SIZE];
|
||||
|
||||
/**
|
||||
* @brief PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD>
|
||||
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ϱ<EFBFBD>32<33>ֽڣ<D6BD>ͷ<EFBFBD><CDB7>0x42<34><32>0x4d<34>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>28<32>ֽ<EFBFBD>
|
||||
*/
|
||||
typedef struct pm2d5_raw_data_st {
|
||||
|
||||
uint8_t data1_h;
|
||||
uint8_t data1_l;
|
||||
|
||||
uint8_t data2_h;
|
||||
uint8_t data2_l;
|
||||
|
||||
uint8_t data3_h;
|
||||
uint8_t data3_l;
|
||||
|
||||
uint8_t data4_h;
|
||||
uint8_t data4_l;
|
||||
|
||||
uint8_t data5_h;
|
||||
uint8_t data5_l;
|
||||
|
||||
uint8_t data6_h;
|
||||
uint8_t data6_l;
|
||||
|
||||
uint8_t data7_h;
|
||||
uint8_t data7_l;
|
||||
|
||||
uint8_t data8_h;
|
||||
uint8_t data8_l;
|
||||
|
||||
uint8_t data9_h;
|
||||
uint8_t data9_l;
|
||||
|
||||
uint8_t data10_h;
|
||||
uint8_t data10_l;
|
||||
|
||||
uint8_t data11_h;
|
||||
uint8_t data11_l;
|
||||
|
||||
uint8_t data12_h;
|
||||
uint8_t data12_l;
|
||||
|
||||
uint8_t data13_h; //<2F>汾<EFBFBD><E6B1BE>
|
||||
uint8_t data13_l; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
uint8_t chk_sum_h; //<2F><>У<EFBFBD><D0A3><EFBFBD><EFBFBD>8λ
|
||||
uint8_t chk_sum_l; //<2F><>У<EFBFBD><D0A3><EFBFBD><EFBFBD>8λ
|
||||
} pm2d5_raw_data_t;
|
||||
|
||||
typedef union pm2d5_raw_data_un {
|
||||
uint8_t data[30];
|
||||
pm2d5_raw_data_t pm2d5_raw_data;
|
||||
}pm2d5_raw_data_u;
|
||||
|
||||
/**
|
||||
* @brief <20><>PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @retval none
|
||||
* @note <20><>Ҫ<EFBFBD>û<EFBFBD><C3BB>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
void pm2d5_parser_input_byte(uint8_t data)
|
||||
{
|
||||
if (tos_chr_fifo_push(&pm2d5_parser_ctrl.parser_rx_fifo, data) == K_ERR_NONE) {
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳɹ<DDB3><C9B9><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
tos_sem_post(&pm2d5_parser_ctrl.parser_rx_sem);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>chr fifo<66><6F>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param none
|
||||
* @retval <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>-1
|
||||
*/
|
||||
static int pm2d5_parser_getchar(void)
|
||||
{
|
||||
uint8_t chr;
|
||||
k_err_t err;
|
||||
|
||||
/* <20><><EFBFBD>õȴ<C3B5><C8B4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>Ϊ<EFBFBD>ձ<EFBFBD>ʾchr fifo<66><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
if (tos_sem_pend(&pm2d5_parser_ctrl.parser_rx_sem, TOS_TIME_FOREVER) != K_ERR_NONE) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* <20><>chr fifo<66><6F>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
err = tos_chr_fifo_pop(&pm2d5_parser_ctrl.parser_rx_fifo, &chr);
|
||||
|
||||
return err == K_ERR_NONE ? chr : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief PM2D5<44><35>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param void
|
||||
* @retval <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>-1
|
||||
*/
|
||||
static int pm2d5_parser_read_raw_data(pm2d5_raw_data_u *pm2d5_raw_data, pm2d5_data_u *pm2d5_data)
|
||||
{
|
||||
int i;
|
||||
uint8_t len_h,len_l;
|
||||
uint16_t len;
|
||||
uint16_t check_sum;
|
||||
uint16_t check_sum_cal = 0x42 + 0x4d;
|
||||
|
||||
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> */
|
||||
len_h = pm2d5_parser_getchar();
|
||||
len_l = pm2d5_parser_getchar();
|
||||
len = (len_h << 8) | len_l;
|
||||
|
||||
if ( len != 0x001C) {
|
||||
//<2F>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
for (i = 0; i < len; i++) {
|
||||
pm2d5_parser_getchar();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD> */
|
||||
for (i = 0; i < len; i++) {
|
||||
pm2d5_raw_data->data[i] = pm2d5_parser_getchar();
|
||||
}
|
||||
|
||||
/* <20><>У<EFBFBD><D0A3> */
|
||||
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
||||
check_sum_cal = check_sum_cal + len_h + len_l;
|
||||
for (i = 0; i < len -2; i++) {
|
||||
check_sum_cal += pm2d5_raw_data->data[i];
|
||||
}
|
||||
//Э<><D0AD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD>ĺ<EFBFBD>У<EFBFBD><D0A3>ֵ
|
||||
check_sum = (pm2d5_raw_data->pm2d5_raw_data.chk_sum_h << 8) + pm2d5_raw_data->pm2d5_raw_data.chk_sum_l;
|
||||
if (check_sum_cal != check_sum) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
||||
for (i = 0; i < sizeof(pm2d5_data_t); i++) {
|
||||
pm2d5_data->data[i] = pm2d5_raw_data->data[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern k_mail_q_t mail_q;
|
||||
pm2d5_raw_data_u pm2d5_raw_data;
|
||||
pm2d5_data_u pm2d5_data;
|
||||
|
||||
/**
|
||||
* @brief PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
static void pm2d5_parser_task_entry(void *arg)
|
||||
{
|
||||
int chr, last_chr = 0;
|
||||
|
||||
while (1) {
|
||||
|
||||
chr = pm2d5_parser_getchar();
|
||||
if (chr < 0) {
|
||||
printf("parser task get char fail!\r\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (chr == 0x4d && last_chr == 0x42) {
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ */
|
||||
if (0 == pm2d5_parser_read_raw_data(&pm2d5_raw_data, &pm2d5_data)) {
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>䷢<EFBFBD><E4B7A2> */
|
||||
tos_mail_q_post(&mail_q, &pm2d5_data, sizeof(pm2d5_data_t));
|
||||
}
|
||||
}
|
||||
|
||||
last_chr = chr;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><>ʼ<EFBFBD><CABC>PM2D5<44><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param none
|
||||
* @retval ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>κ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD>-1
|
||||
*/
|
||||
int pm2d5_parser_init(void)
|
||||
{
|
||||
k_err_t ret;
|
||||
|
||||
memset((pm2d5_parser_ctrl_t*)&pm2d5_parser_ctrl, 0, sizeof(pm2d5_parser_ctrl));
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD> chr fifo */
|
||||
ret = tos_chr_fifo_create(&pm2d5_parser_ctrl.parser_rx_fifo, pm2d5_parser_buffer, sizeof(pm2d5_parser_buffer));
|
||||
if (ret != K_ERR_NONE) {
|
||||
printf("pm2d5 parser chr fifo create fail, ret = %d\r\n", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD> */
|
||||
ret = tos_sem_create(&pm2d5_parser_ctrl.parser_rx_sem, 0);
|
||||
if (ret != K_ERR_NONE) {
|
||||
printf("pm2d5 parser_rx_sem create fail, ret = %d\r\n", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> */
|
||||
ret = tos_task_create(&pm2d5_parser_ctrl.parser_task, "pm2d5_parser_task",
|
||||
pm2d5_parser_task_entry, NULL, PM2D5_PARSER_TASK_PRIO,
|
||||
pm2d5_parser_task_stack,PM2D5_PARSER_TASK_STACK_SIZE,0);
|
||||
if (ret != K_ERR_NONE) {
|
||||
printf("pm2d5 parser task create fail, ret = %d\r\n", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user