222 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 | 
						|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
						|
be copied by any method or incorporated into another program without
 | 
						|
the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
liability for its use in any way and conveys no license or title under
 | 
						|
any patent or copyright and makes no representation or warranty that this
 | 
						|
Information is free from patent or copyright infringement.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
#include "app_main_task.h"
 | 
						|
#include "app_config.h"
 | 
						|
#include "app_common.h"
 | 
						|
#include "app_uart.h"
 | 
						|
#include "app_cus_task.h"
 | 
						|
#include "iot_app_pib_api.h"
 | 
						|
#include "iot_plc_led_api.h"
 | 
						|
 | 
						|
#define UART_STOP_BITS_NUM          3
 | 
						|
 | 
						|
/* global buffer to hold uart half frame. */
 | 
						|
uart_handle_buffer g_uart_buffer;
 | 
						|
 | 
						|
uint8_t app_uart_is_valid(uint32_t baudrate, uint8_t data_bits,
 | 
						|
    uint8_t stop_bits, uint8_t parity, uint32_t thresholdvalue)
 | 
						|
{
 | 
						|
    switch (baudrate) {
 | 
						|
        case 3000000:
 | 
						|
        case 921600:
 | 
						|
        case 380400:
 | 
						|
        case 115200:
 | 
						|
        case 38400:
 | 
						|
        case 19200:
 | 
						|
        case 9600:
 | 
						|
        case 4800:
 | 
						|
        case 2400:
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            return false;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (data_bits) {
 | 
						|
        case IOT_UART_DLEN_5_BITS:
 | 
						|
        case IOT_UART_DLEN_6_BITS:
 | 
						|
        case IOT_UART_DLEN_7_BITS:
 | 
						|
        case IOT_UART_DLEN_8_BITS:
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            return false;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (stop_bits) {
 | 
						|
        case IOT_UART_STOP_1_BITS:
 | 
						|
        case IOT_UART_STOP_1_5_BITS:
 | 
						|
        case IOT_UART_STOP_2_BITS:
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            return false;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (parity) {
 | 
						|
        case IOT_UART_PARITY_NONE:
 | 
						|
        case IOT_UART_PARITY_ODD:
 | 
						|
        case IOT_UART_PARITY_EVEN:
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            return false;
 | 
						|
    }
 | 
						|
 | 
						|
    if(thresholdvalue > APP_MAX_THDVALUE ||
 | 
						|
        thresholdvalue < APP_DEFAULT_THDVALUE){
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
uint16_t app_uart_tx(iot_uart_h hdl, uint8_t * data, uint16_t data_length)
 | 
						|
{
 | 
						|
    if (NULL == data || data_length == 0) {
 | 
						|
        APP_PRINTF("[ERR] %s Data is NULL !!", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_pkt_t *uart_pkt;
 | 
						|
    if (NULL == (uart_pkt = iot_pkt_alloc(data_length, IOT_APP_DL645_MID))) {
 | 
						|
        APP_PRINTF("[ERR] %s Packet Alloc Failed !!", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    os_mem_cpy(iot_pkt_put(uart_pkt, data_length), (void *)data, data_length);
 | 
						|
    APP_PRINT_BUF("[UART_TX]", data, data_length);
 | 
						|
 | 
						|
    iot_uart_send(hdl, uart_pkt, NULL);
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/* Post the data from uart port to the message queue. */
 | 
						|
static uint32_t app_uart_recv(uint8_t* buffer, uint32_t buffer_len,
 | 
						|
    bool_t is_full_frame, uint32_t invalid_data_len)
 | 
						|
{
 | 
						|
    (void)is_full_frame;
 | 
						|
    (void)invalid_data_len;
 | 
						|
    iot_pkt_t *pkt;
 | 
						|
 | 
						|
    iot_plc_led_request(IOT_PLC_LED_REQ_PLC_485_RX);
 | 
						|
    APP_PRINT_BUF("[UART_RX]: ", buffer, buffer_len);
 | 
						|
 | 
						|
    if (NULL == (pkt = iot_pkt_alloc(buffer_len, IOT_APP_DL645_MID))) {
 | 
						|
        APP_PRINTF("[ERR] %s Packet Alloc Failed !!", __FUNCTION__);
 | 
						|
        return ERR_NOMEM;
 | 
						|
    }
 | 
						|
    os_mem_cpy(iot_pkt_put(pkt, buffer_len), buffer, buffer_len);
 | 
						|
 | 
						|
    iot_cus_task_msg_post(E_CUS_MSG_FROM_UART, E_CUS_MSG_ID_BYTES_RECV, pkt);
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
void app_uart_buf_clear(void)
 | 
						|
{
 | 
						|
    /* 之前存在断帧,超时时间已过就将之前的断帧数据清除 */
 | 
						|
    if ((g_uart_buffer.buff_len > 0) &&
 | 
						|
        (g_uart_buffer.boot_tm + UART_RECV_TIMEOUT < os_boot_time32())) {
 | 
						|
        os_mem_set(g_uart_buffer.buff_tmp, 0, g_uart_buffer.buff_len);
 | 
						|
        g_uart_buffer.buff_len = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    g_uart_buffer.boot_tm = os_boot_time32();
 | 
						|
}
 | 
						|
 | 
						|
uart_handle_buffer *app_get_uart_buf_info(void)
 | 
						|
{
 | 
						|
    return &g_uart_buffer;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t app_uart_reassign_pin(uint8_t port, uint8_t rx_pin, uint8_t tx_pin)
 | 
						|
{
 | 
						|
    uint8_t ret = ERR_FAIL;
 | 
						|
 | 
						|
    /* chehck uart port is valid */
 | 
						|
    if (port >= iot_uart_get_max_port_num()) {
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    /* set uart rx pin as input */
 | 
						|
    ret = iot_gpio_open_as_input(rx_pin);
 | 
						|
    if (ret) {
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    /* set uart tx pin as output */
 | 
						|
    ret = iot_gpio_open_as_output(tx_pin);
 | 
						|
    if (ret) {
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    /* set uart port pin */
 | 
						|
    iot_uart_set_pin(port, rx_pin, tx_pin);
 | 
						|
 | 
						|
out:
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint16_t app_uart_init(iot_uart_h *uart_handle)
 | 
						|
{
 | 
						|
    uint8_t port;
 | 
						|
    uint8_t port_name = UART_CUS_PORT_0;
 | 
						|
    uart_cfg_t uart = {0};
 | 
						|
    iot_pkt_t *tmp_pkt;
 | 
						|
 | 
						|
    /* Get uart port for tranceiving data, not for printf() used. */
 | 
						|
    if ((port = iot_board_get_uart(port_name)) >= iot_uart_get_max_port_num()) {
 | 
						|
        APP_PRINTF("[ERR] %s Invalid UART#%d !!", __FUNCTION__, port);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    *uart_handle = iot_uart_open(port, (iot_uart_recv_func_t)app_uart_recv,
 | 
						|
        UART_RCV_BUF_LEN, NULL);
 | 
						|
    if (NULL == *uart_handle) {
 | 
						|
        APP_PRINTF("[ERR] %s Open UART#%d Failed !!", __FUNCTION__, port);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    if (iot_app_get_uart_cfg_in_pib(&uart) != ERR_OK
 | 
						|
        || 0 == uart.uart_conf_vaild) {
 | 
						|
        APP_PRINTF("[ERR] %s Get uart config failed, we will use default param!",
 | 
						|
            __FUNCTION__);
 | 
						|
        uart.baud_rate = APP_DEFAULT_BAUND_RATE;
 | 
						|
        uart.data_bits = APP_DEFAULT_DATA_BITS;
 | 
						|
        uart.stop_bits = APP_DEFAULT_STOP_BITS;
 | 
						|
        uart.parity = APP_DEFAULT_PARITY;
 | 
						|
        uart.threshold_value = APP_DEFAULT_THDVALUE;
 | 
						|
    }
 | 
						|
 | 
						|
    APP_PRINTF("[INF]%s baudrate=%d, data_bits=%d, stop_bits=%d, "
 | 
						|
        "parity=%d, thresholdvalue=%d", __FUNCTION__, uart.baud_rate,
 | 
						|
        uart.data_bits, uart.stop_bits, uart.parity, uart.threshold_value);
 | 
						|
 | 
						|
    iot_uart_set_config(*uart_handle, uart.baud_rate, uart.parity,
 | 
						|
        uart.data_bits, uart.stop_bits);
 | 
						|
 | 
						|
    iot_uart_set_threshold(*uart_handle,  UART_THR_RXTIMEOUT,
 | 
						|
        uart.threshold_value);
 | 
						|
    iot_uart_set_threshold(*uart_handle, UART_THR_NO_FMT_TIMEOUT, 20);
 | 
						|
 | 
						|
    tmp_pkt = iot_pkt_alloc(UART_BUF_MAX_LEN, IOT_APP_DL645_MID);
 | 
						|
    if (NULL == tmp_pkt) {
 | 
						|
        APP_PRINTF("[ERR] ALLOC PKT FAILED !!");
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
        /* 创建空间缓存串口数据 */
 | 
						|
    g_uart_buffer.buff_tmp = (uint8_t*)iot_pkt_data(tmp_pkt);
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 |