inwudriver-weibo/app/mrs/dfx/mrs_dfx.c

316 lines
9.1 KiB
C

/*
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
* Description: MRS DFX.
*/
#include "mrs_dfx.h"
#include <dfx_app.h>
#include "mrs_cco_tf.h"
typedef struct {
uart_chl_inf uart_chl[2]; /* 2groups */
plc_chl_inf plc_chl[2]; /* 2groups */
} mrs_dfx_ctx;
td_u32 mrs_stat_uart_rx(td_void);
td_u32 mrs_stat_plc_rx(td_void);
static mrs_dfx_ctx g_mrs_dfx;
td_void mrs_dfx_init(td_void)
{
memset_s(&g_mrs_dfx, sizeof(g_mrs_dfx), 0, sizeof(g_mrs_dfx));
#if (defined(PRODUCT_CFG_PRODUCT_TYPE_CCO) || defined(PRODUCT_CFG_PRODUCT_TYPE_STA))
uapi_sys_register_reset_notify(mrs_stat_uart_rx, EXT_RST_CON_USR0);
uapi_sys_register_reset_notify(mrs_stat_plc_rx, EXT_RST_CON_USR1);
#endif
}
td_u32 mrs_stat_uart_rx(td_void)
{
return g_mrs_dfx.uart_chl[1].rx_ok_num;
}
td_u32 mrs_stat_plc_rx(td_void)
{
return g_mrs_dfx.plc_chl[1].rx_total_num;
}
td_void mrs_dfx_uart_chl_rx(const td_u8 * const data, td_u16 data_len, td_bool msg_proc)
{
uart_chl_inf *inf = (msg_proc == TD_FALSE) ? &g_mrs_dfx.uart_chl[0] : &g_mrs_dfx.uart_chl[1];
td_u16 idx;
td_u16 tail;
td_u16 max_len;
if ((data == TD_NULL) || (data_len == 0)) {
return;
}
inf->rx_total_len += data_len;
inf->rx_last_time = uapi_get_milli_seconds();
tail = inf->rx_buf_tail;
max_len = (td_u16)sizeof(inf->rx_buf);
tail %= max_len;
for (idx = 0; idx < data_len; idx++) {
inf->rx_buf[tail++] = data[idx];
tail %= max_len;
}
inf->rx_buf_tail = tail;
}
td_void mrs_dfx_uart_chl_err_rx(td_u16 data_len, td_u32 err_cause, td_bool msg_proc)
{
uart_chl_inf *inf = (msg_proc == TD_FALSE) ? &g_mrs_dfx.uart_chl[0] : &g_mrs_dfx.uart_chl[1];
inf->rx_err_len += data_len;
inf->rx_err_cause = (td_u16)err_cause;
}
td_void mrs_dfx_uart_chl_rx_frame(td_u16 data_len, td_u32 err_cause, td_bool msg_proc)
{
uart_chl_inf *inf = (msg_proc == TD_FALSE) ? &g_mrs_dfx.uart_chl[0] : &g_mrs_dfx.uart_chl[1];
if (err_cause == EXT_ERR_SUCCESS) {
inf->rx_ok_len += data_len;
inf->rx_ok_num++;
} else {
inf->rx_err_len += data_len;
inf->rx_err_num++;
inf->rx_err_cause = (td_u16)err_cause;
}
}
td_void mrs_dfx_uart_chl_tx(const td_u8 *data, td_u16 data_len)
{
td_u8 i;
for (i = 0; i < 2; i++) { /* 2groups */
uart_chl_inf *inf = &g_mrs_dfx.uart_chl[i];
inf->tx_total_len += data_len;
inf->tx_last_time = uapi_get_milli_seconds();
inf->tx_total_num++;
inf->tx_last_len = data_len;
memset_s(inf->tx_buf, sizeof(inf->tx_buf), 0, sizeof(inf->tx_buf));
if (memcpy_s(inf->tx_buf, sizeof(inf->tx_buf), data, uapi_min(sizeof(inf->tx_buf), data_len)) != EOK) {
return;
}
}
}
td_void mrs_dfx_uart_chl_tx_ok_cnt(td_u16 data_len)
{
td_u8 i;
for (i = 0; i < 2; i++) { /* 2groups */
uart_chl_inf *inf = &g_mrs_dfx.uart_chl[i];
inf->tx_ok_len += data_len;
inf->tx_ok_num++;
}
}
td_void mrs_dfx_uart_chl_tx_err_cnt(td_u16 data_len, td_u32 err_cause)
{
td_u8 i;
for (i = 0; i < 2; i++) { /* 2groups */
uart_chl_inf *inf = &g_mrs_dfx.uart_chl[i];
inf->tx_err_len += data_len;
inf->tx_err_num++;
inf->tx_err_cause = (td_u16)err_cause;
}
}
td_void mrs_dfx_plc_chl_rx(const ext_dms_chl_rx *rx)
{
plc_chl_inf *inf = &g_mrs_dfx.plc_chl[0];
if (rx == TD_NULL) {
return;
}
inf->rx_total_num++;
inf->rx_time = uapi_get_milli_seconds();
inf->rx_id = rx->id;
memcpy_s(inf->src_mac, sizeof(inf->src_mac), rx->src_mac, sizeof(rx->src_mac));
inf->rx_len = rx->payload_len;
memset_s(inf->rx_buf, sizeof(inf->rx_buf), 0, sizeof(inf->rx_buf));
if (memcpy_s(inf->rx_buf, sizeof(inf->rx_buf),
rx->payload, uapi_min(sizeof(inf->rx_buf), rx->payload_len)) != EOK) {
return;
}
}
td_void mrs_dfx_plc_chl_err_rx(const ext_dms_chl_rx *rx, td_u32 err_cause)
{
plc_chl_inf *inf = &g_mrs_dfx.plc_chl[0];
if (rx == TD_NULL) {
return;
}
inf->rx_err_num++;
inf->rx_err_time = uapi_get_milli_seconds();
inf->rx_err_id = rx->id;
memcpy_s(inf->err_src_mac, sizeof(inf->err_src_mac), rx->src_mac, sizeof(rx->src_mac));
inf->rx_err_cause = (td_u16)err_cause;
inf->rx_err_len = rx->payload_len;
memset_s(inf->rx_err_buf, sizeof(inf->rx_err_buf), 0, sizeof(inf->rx_buf));
if (memcpy_s(inf->rx_err_buf, sizeof(inf->rx_err_buf),
rx->payload, uapi_min(sizeof(inf->rx_buf), rx->payload_len)) != EOK) {
return;
}
}
td_void mrs_dfx_plc_rx_proc(const mrs_plc_frame_data *rx)
{
plc_chl_inf *inf = &g_mrs_dfx.plc_chl[1];
if (rx == TD_NULL) {
return;
}
inf->rx_total_num++;
inf->rx_time = uapi_get_milli_seconds();
inf->rx_id = rx->id;
memcpy_s(inf->src_mac, sizeof(inf->src_mac), rx->addr, sizeof(rx->addr));
inf->rx_len = rx->payload_len;
memset_s(inf->rx_buf, sizeof(inf->rx_buf), 0, sizeof(inf->rx_buf));
if (memcpy_s(inf->rx_buf, sizeof(inf->rx_buf),
rx->payload, uapi_min(sizeof(inf->rx_buf), rx->payload_len)) != EOK) {
return;
}
}
td_void mrs_dfx_plc_rx_err_proc(const mrs_plc_frame_data *rx, td_u32 err_cause)
{
plc_chl_inf *inf = &g_mrs_dfx.plc_chl[1];
if (rx == TD_NULL) {
return;
}
inf->rx_err_num++;
inf->rx_err_time = uapi_get_milli_seconds();
inf->rx_err_id = rx->id;
memcpy_s(inf->err_src_mac, sizeof(inf->err_src_mac), rx->addr, sizeof(rx->addr));
inf->rx_err_cause = (td_u16)err_cause;
inf->rx_err_len = rx->payload_len;
memset_s(inf->rx_err_buf, sizeof(inf->rx_err_buf), 0, sizeof(inf->rx_buf));
if (memcpy_s(inf->rx_err_buf, sizeof(inf->rx_err_buf),
rx->payload, uapi_min(sizeof(inf->rx_err_buf), rx->payload_len)) != EOK) {
return;
}
}
td_void mrs_dfx_plc_chl_tx(const mrs_plc_frame_data *tx, td_bool msg_proc)
{
plc_chl_inf *inf = (msg_proc == TD_FALSE) ? &g_mrs_dfx.plc_chl[0] : &g_mrs_dfx.plc_chl[1];
if (tx == TD_NULL) {
return;
}
inf->tx_total_num++;
inf->tx_time = uapi_get_milli_seconds();
inf->tx_id = tx->id;
memcpy_s(inf->dst_mac, sizeof(inf->dst_mac), tx->addr, sizeof(tx->addr));
inf->tx_len = tx->payload_len;
memset_s(inf->tx_buf, sizeof(inf->tx_buf), 0, sizeof(inf->tx_buf));
if (memcpy_s(inf->tx_buf, sizeof(inf->tx_buf),
tx->payload, uapi_min(sizeof(inf->tx_buf), tx->payload_len)) != EOK) {
return;
}
}
td_void mrs_dfx_plc_chl_err_tx(const mrs_plc_frame_data *tx, td_bool msg_proc, td_u32 err_cause)
{
plc_chl_inf *inf = (msg_proc == TD_FALSE) ? &g_mrs_dfx.plc_chl[0] : &g_mrs_dfx.plc_chl[1];
if (tx == TD_NULL) {
return;
}
inf->tx_fail_num++;
inf->tx_fail_time = uapi_get_milli_seconds();
inf->tx_id = tx->id;
inf->tx_err_cause = (td_u16)err_cause;
memcpy_s(inf->fail_dst_mac, sizeof(inf->fail_dst_mac), tx->addr, sizeof(tx->addr));
inf->tx_fail_len = tx->payload_len;
memset_s(inf->tx_fail_buf, sizeof(inf->tx_fail_buf), 0, sizeof(inf->tx_buf));
if (memcpy_s(inf->tx_fail_buf, sizeof(inf->tx_fail_buf),
tx->payload, uapi_min(sizeof(inf->tx_fail_buf), tx->payload_len)) != EOK) {
return;
}
}
td_u32 mrs_diag_dfx(td_u16 id, td_pvoid cmd, td_u16 cmd_size, td_u8 option)
{
td_pbyte payload = TD_NULL;
td_u16 payload_len = 0;
ext_unref_param(cmd);
ext_unref_param(cmd_size);
switch (id) {
case ID_DIAG_CMD_UART_MSG_SEND_INF:
payload = (td_pbyte)&g_mrs_dfx.uart_chl[0];
payload_len = sizeof(g_mrs_dfx.uart_chl[0]);
break;
case ID_DIAG_CMD_UART_MSG_PROC_INF:
payload = (td_pbyte)&g_mrs_dfx.uart_chl[1];
payload_len = sizeof(g_mrs_dfx.uart_chl[1]);
break;
case ID_DIAG_CMD_PLC_MSG_SEND_INF:
payload = (td_pbyte)&g_mrs_dfx.plc_chl[0];
payload_len = sizeof(g_mrs_dfx.plc_chl[0]);
break;
case ID_DIAG_CMD_PLC_MSG_PROC_INF:
payload = (td_pbyte)&g_mrs_dfx.plc_chl[1];
payload_len = sizeof(g_mrs_dfx.plc_chl[1]);
break;
default:
return EXT_ERR_INVALID_PARAMETER;
}
return uapi_diag_report_packet(id, option, payload, payload_len, TD_FALSE);
}
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
td_u32 mrs_dfx_tf(td_u16 id, td_pvoid cmd, td_u16 cmd_size, td_u8 option)
{
td_u32 ret = EXT_ERR_NOT_SUPPORT;
switch (id) {
case ID_DIAG_CMD_TF_CTRL:
ret = mrs_dfx_tf_ctrl((diag_cmd_tf_ctrl_req *)cmd, cmd_size, option);
break;
case ID_DIAG_CMD_TF_RESULT_QUERY:
ret = mrs_dfx_tf_result_query((diag_cmd_tf_result_req *)cmd, cmd_size, option);
break;
default:
break;
}
return ret;
}
#endif