feat: add rust demo

This commit is contained in:
ikey4u
2021-01-12 23:47:54 +08:00
parent 1aca57c9c6
commit 0cdfd83eb6
61 changed files with 6894 additions and 0 deletions

View File

@@ -0,0 +1,202 @@
/*----------------------------------------------------------------------------
* 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 "ch20_parser.h"
static ch20_parser_ctrl_t ch20_parser_ctrl;
static k_stack_t ch20_parser_task_stack[CH20_PARSER_TASK_STACK_SIZE];
static uint8_t ch20_parser_buffer[CH20_PARSER_BUFFER_SIZE];
/**
* @brief <20><>ch20<32><30><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 ch20_parser_input_byte(uint8_t data)
{
if (tos_chr_fifo_push(&ch20_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(&ch20_parser_ctrl.parser_rx_sem);
}
}
/**
* @brief ch20<32><30><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 ch20_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(&ch20_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(&ch20_parser_ctrl.parser_rx_fifo, &chr);
return err == K_ERR_NONE ? chr : -1;
}
/**
* @brief ch20<32><30>ȡ<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 ch20_parser_read_raw_data(ch20_data_t *ch20_data)
{
uint8_t data;
uint8_t data_h, data_l;
uint8_t check_sum_cal = 0x17;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ũ<EFBFBD>ȵ<EFBFBD>λ */
data = ch20_parser_getchar();
if (data != 0x04) {
return -1;
}
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
check_sum_cal += data;
/* <20><>ȡС<C8A1><D0A1>λ<EFBFBD><CEBB> */
data = ch20_parser_getchar();
if (data != 0x00) {
return -1;
}
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
check_sum_cal += data;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ũ<EFBFBD>ȸ<EFBFBD>λ */
data = ch20_parser_getchar();
if (data == 0xFF) {
return -1;
}
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
data_h = data;
check_sum_cal += data;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ũ<EFBFBD>ȵ<EFBFBD>λ */
data = ch20_parser_getchar();
if (data == 0xFF) {
return -1;
}
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
data_l = data;
check_sum_cal += data;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>λ */
data = ch20_parser_getchar();
if (data != 0x07) {
return -1;
}
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
check_sum_cal += data;
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>λ */
data = ch20_parser_getchar();
if (data != 0xD0) {
return -1;
}
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
check_sum_cal += data;
/* <20><>У<EFBFBD><D0A3> */
data = ch20_parser_getchar();
CH20_DEBUG_LOG("--->[%#02x]\r\n", data);
check_sum_cal = ~(check_sum_cal) + 1;
CH20_DEBUG_LOG("check_sum_cal is 0x%02x \r\n", check_sum_cal);
if (check_sum_cal != data) {
return -1;
}
/* <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD> */
ch20_data->data = (data_h << 8) + data_l;
CH20_DEBUG_LOG("ch20_data->data is 0x%04x\r\n", ch20_data->data);
return 0;
}
extern k_mail_q_t mail_q;
ch20_data_t ch20_data;
/**
* @brief ch20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void ch20_parser_task_entry(void *arg)
{
int chr, last_chr = 0;
while (1) {
chr = ch20_parser_getchar();
if (chr < 0) {
printf("parser task get char fail!\r\n");
continue;
}
if (chr == 0x17 && last_chr == 0xFF) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ */
if (0 == ch20_parser_read_raw_data(&ch20_data)) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B7A2> */
tos_mail_q_post(&mail_q, &ch20_data, sizeof(ch20_data_t));
}
}
last_chr = chr;
}
}
/**
* @brief <20><>ʼ<EFBFBD><CABC>ch20<32><30><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 ch20_parser_init(void)
{
k_err_t ret;
memset((ch20_parser_ctrl_t*)&ch20_parser_ctrl, 0, sizeof(ch20_parser_ctrl));
/* <20><><EFBFBD><EFBFBD> chr fifo */
ret = tos_chr_fifo_create(&ch20_parser_ctrl.parser_rx_fifo, ch20_parser_buffer, sizeof(ch20_parser_buffer));
if (ret != K_ERR_NONE) {
printf("ch20 parser chr fifo create fail, ret = %d\r\n", ret);
return -1;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD> */
ret = tos_sem_create(&ch20_parser_ctrl.parser_rx_sem, 0);
if (ret != K_ERR_NONE) {
printf("ch20 parser_rx_sem create fail, ret = %d\r\n", ret);
return -1;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> */
ret = tos_task_create(&ch20_parser_ctrl.parser_task, "ch20_parser_task",
ch20_parser_task_entry, NULL, CH20_PARSER_TASK_PRIO,
ch20_parser_task_stack,CH20_PARSER_TASK_STACK_SIZE,0);
if (ret != K_ERR_NONE) {
printf("ch20 parser task create fail, ret = %d\r\n", ret);
return -1;
}
return 0;
}