771 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			771 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
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 "iot_tput.h"
 | 
						|
/* os_ship header files */
 | 
						|
#include "os_task_api.h"
 | 
						|
#include "os_event_api.h"
 | 
						|
#include "os_utils_api.h"
 | 
						|
#include "iot_io.h"
 | 
						|
#include "iot_pkt_api.h"
 | 
						|
#include "iot_errno_api.h"
 | 
						|
#include "iot_app_api.h"
 | 
						|
#include "iot_plc_msg_api.h"
 | 
						|
#include "iot_plc_msg_cco_api.h"
 | 
						|
 | 
						|
#if IOT_TPUT_APP_ENABLE
 | 
						|
 | 
						|
uint8_t app_tput_cco_mac[] = {0x48, 0x55, 0x5C, 0xAA, 0xBB, 0xCC};
 | 
						|
uint8_t app_tput_sta_mac[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x11};
 | 
						|
 | 
						|
/* iot tput global data */
 | 
						|
iot_tput_global_t* p_iot_tput_glb = NULL;
 | 
						|
 | 
						|
uint32_t iot_tput_get_msdu_len()
 | 
						|
{
 | 
						|
    return p_iot_tput_glb->tput_cfg.msdu_size;
 | 
						|
}
 | 
						|
 | 
						|
void iot_tput_send_msg(uint16_t msg_type, uint16_t msg_id, \
 | 
						|
                       void* data1)
 | 
						|
{
 | 
						|
    iot_task_msg_t          *msg;
 | 
						|
    iot_tput_msg_t     *task_msg;
 | 
						|
    msg = iot_task_alloc_msg_with_reserved(p_iot_tput_glb->handle, 0);
 | 
						|
    if (!msg) {
 | 
						|
        iot_printf("%s, no msg\n", __FUNCTION__);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    task_msg = (iot_tput_msg_t*)msg;
 | 
						|
    task_msg->msg.type = msg_type;
 | 
						|
    task_msg->msg.id = msg_id;
 | 
						|
    task_msg->data = data1;
 | 
						|
    iot_task_queue_msg(p_iot_tput_glb->handle, \
 | 
						|
                       &task_msg->msg, IOT_TPUT_TASK_QUEUE_LP);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
void iot_plc_recv_tput(void *param, iot_pkt_t *pkt)
 | 
						|
{
 | 
						|
    (void)param;
 | 
						|
    iot_tput_send_msg(IOT_TPUT_PLC_MSG, 0, pkt);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
void iot_plc_tput_handle_mac_msg(iot_pkt_t *pkt)
 | 
						|
{
 | 
						|
    iot_plc_msg_header_t *hdr =
 | 
						|
        (iot_plc_msg_header_t*)iot_pkt_block_ptr(pkt, IOT_PKT_BLOCK_DATA);
 | 
						|
 | 
						|
    if (hdr->app_id != IOT_PLC_APP_ID_BCAST &&
 | 
						|
        hdr->app_id != IOT_TPUT_APP_ID) {
 | 
						|
        /* drop corrupted message */
 | 
						|
        iot_pkt_free(pkt);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    if (p_iot_tput_glb->app_registered == 0 &&
 | 
						|
        hdr->msg_id != IOT_PLC_MSG_APP_REG_CONF) {
 | 
						|
        /* only handle app register confirm message before app registered */
 | 
						|
        iot_pkt_free(pkt);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (hdr->msg_id) {
 | 
						|
    /* register app */
 | 
						|
    case IOT_PLC_MSG_APP_REG_CONF:
 | 
						|
    {
 | 
						|
        iot_plc_app_reg_conf_t* rpt = (iot_plc_app_reg_conf_t*)(hdr + 1);
 | 
						|
        if (rpt->result == IOT_PLC_SUCCESS ||
 | 
						|
            rpt->result == IOT_PLC_SUCCESS_MODIFIED) {
 | 
						|
            p_iot_tput_glb->app_registered = 1;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    /* state change 1. in -> out ready = 1
 | 
						|
     *              2. out -> in ready = 0
 | 
						|
     */
 | 
						|
    case IOT_PLC_MSG_DEV_STATE_CHANGE_RPT :
 | 
						|
    {
 | 
						|
        iot_plc_dev_state_change_rpt_t* rpt =
 | 
						|
            (iot_plc_dev_state_change_rpt_t*)(hdr + 1);
 | 
						|
 | 
						|
        if(rpt->is_ready)
 | 
						|
        {
 | 
						|
            iot_printf("[tput_dbg] STATE CHANGE REPORT, MY ROLE TYPE#%d.\n",
 | 
						|
                rpt->dev_role);
 | 
						|
 | 
						|
            iot_printf("[tput_dbg] CCO MAC: %02x-%02x-%02x-%02x-%02x-%02x.\n",
 | 
						|
                rpt->cco_mac[0], rpt->cco_mac[1], rpt->cco_mac[2],
 | 
						|
                rpt->cco_mac[3], rpt->cco_mac[4], rpt->cco_mac[5]);
 | 
						|
 | 
						|
            iot_printf("[tput_dbg] LOCAL MAC : %02x-%02x-%02x-%02x-%02x-%02x.\n",
 | 
						|
                rpt->local_mac[0], rpt->local_mac[1], rpt->local_mac[2],
 | 
						|
                rpt->local_mac[3], rpt->local_mac[4], rpt->local_mac[5]);
 | 
						|
 | 
						|
            if(IOT_PLC_DEV_ROLE_STA == rpt->dev_role)
 | 
						|
            {
 | 
						|
                iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.rmt_addr, rpt->cco_mac);
 | 
						|
                p_iot_tput_glb->tput_dev.rmt_valid = true;
 | 
						|
            }
 | 
						|
 | 
						|
            p_iot_tput_glb->tput_dev.dev_ready  = true;
 | 
						|
            p_iot_tput_glb->tput_dev.dev_role   = rpt->dev_role;
 | 
						|
            p_iot_tput_glb->tput_dev.nid        = rpt->nid;
 | 
						|
 | 
						|
            iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.mac_addr, rpt->local_mac);
 | 
						|
            iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.cco_addr, rpt->cco_mac);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            iot_printf("MAC IS NOT READY.",1,2,3,4,5,6);
 | 
						|
            p_iot_tput_glb->tput_dev.dev_ready  = false;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    /*call iot_plc_query_dev_info */
 | 
						|
    case IOT_PLC_MSG_DEV_INFO_RPT :
 | 
						|
    {
 | 
						|
        iot_plc_dev_info_rpt_t* rpt =
 | 
						|
            (iot_plc_dev_info_rpt_t*)(hdr + 1);
 | 
						|
        if(rpt->is_ready)
 | 
						|
        {
 | 
						|
            iot_printf("[tput_dbg] DEVICE INFO REPORT MAC GET READY, MY ROLE TYPE#%d.\n",
 | 
						|
                rpt->dev_role,2,3,4,5,6);
 | 
						|
 | 
						|
            iot_printf("[tput_dbg] CCO MAC   : %02x-%02x-%02x-%02x-%02x-%02x.\n",
 | 
						|
                rpt->cco_mac[0], rpt->cco_mac[1], rpt->cco_mac[2],
 | 
						|
                rpt->cco_mac[3], rpt->cco_mac[4], rpt->cco_mac[5]);
 | 
						|
 | 
						|
            iot_printf("LOCAL MAC : %02x-%02x-%02x-%02x-%02x-%02x.",
 | 
						|
                rpt->local_mac[0], rpt->local_mac[1], rpt->local_mac[2],
 | 
						|
                rpt->local_mac[3], rpt->local_mac[4], rpt->local_mac[5]);
 | 
						|
 | 
						|
            p_iot_tput_glb->tput_dev.dev_ready  = true;
 | 
						|
            p_iot_tput_glb->tput_dev.dev_role   = rpt->dev_role;
 | 
						|
 | 
						|
            if(IOT_PLC_DEV_ROLE_STA == rpt->dev_role)
 | 
						|
            {
 | 
						|
                iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.rmt_addr, rpt->cco_mac);
 | 
						|
                p_iot_tput_glb->tput_dev.rmt_valid = true;
 | 
						|
            }
 | 
						|
 | 
						|
            iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.mac_addr, rpt->local_mac);
 | 
						|
            iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.cco_addr, rpt->cco_mac);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            iot_printf("[tput_dbg] MAC IS NOT READY.\n");
 | 
						|
            p_iot_tput_glb->tput_dev.dev_ready  = false;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    /* cco a sta join net */
 | 
						|
    case IOT_PLC_MSG_STA_JOIN_INFO :
 | 
						|
    {
 | 
						|
        iot_plc_sta_join_info_t* rpt = (iot_plc_sta_join_info_t*)(hdr + 1);
 | 
						|
        iot_printf("[tput_dbg] STA JOINED : MAC#%02x-%02x-%02x-%02x-%02x-%02x.\n",
 | 
						|
            rpt->sta_info.addr[0], rpt->sta_info.addr[1],
 | 
						|
            rpt->sta_info.addr[2], rpt->sta_info.addr[3],
 | 
						|
            rpt->sta_info.addr[4], rpt->sta_info.addr[5]);
 | 
						|
 | 
						|
        if(IOT_PLC_DEV_ROLE_CCO == p_iot_tput_glb->tput_dev.dev_role)
 | 
						|
        {
 | 
						|
            /* Keep the remote device as the last one we got. */
 | 
						|
            iot_mac_addr_cpy(p_iot_tput_glb->tput_dev.rmt_addr, rpt->sta_info.addr);
 | 
						|
            p_iot_tput_glb->tput_dev.rmt_valid = true;
 | 
						|
        }
 | 
						|
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    /* cco have sta leave net */
 | 
						|
    case IOT_PLC_MSG_STA_LEAVE_INFO :
 | 
						|
    {
 | 
						|
        uint32_t cnt;
 | 
						|
        iot_plc_sta_leave_info_t* rpt =
 | 
						|
            (iot_plc_sta_leave_info_t*)(hdr + 1);
 | 
						|
 | 
						|
        for(cnt = 0; cnt < rpt->sta_count; cnt++)
 | 
						|
        {
 | 
						|
            iot_printf("[tput_dbg] STA LEAVED : MAC#%02x-%02x-%02x-%02x-%02x-%02x.\n",
 | 
						|
               rpt->sta[cnt].mac_addr[0], rpt->sta[cnt].mac_addr[1],
 | 
						|
               rpt->sta[cnt].mac_addr[2], rpt->sta[cnt].mac_addr[3],
 | 
						|
               rpt->sta[cnt].mac_addr[4], rpt->sta[cnt].mac_addr[5]);
 | 
						|
 | 
						|
               if((IOT_PLC_DEV_ROLE_STA == p_iot_tput_glb->tput_dev.dev_role)
 | 
						|
                &&(iot_mac_addr_cmp
 | 
						|
                (p_iot_tput_glb->tput_dev.rmt_addr, rpt->sta[cnt].mac_addr)))
 | 
						|
               {
 | 
						|
                   p_iot_tput_glb->tput_dev.rmt_valid = false;
 | 
						|
               }
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    /* receive plc pkt */
 | 
						|
    case IOT_PLC_MSG_MSDU_RECV :
 | 
						|
    {
 | 
						|
        iot_plc_msdu_recv_t *msdu = (iot_plc_msdu_recv_t*)(hdr + 1);
 | 
						|
 | 
						|
        iot_printf("[tput_dbg] MSDU RECEIVED FROM MAC#%02x-%02x-%02x-%02x-%02x-%02x.\n",
 | 
						|
                   msdu->src[0], msdu->src[1], msdu->src[2],
 | 
						|
                   msdu->src[3], msdu->src[4], msdu->src[5]);
 | 
						|
 | 
						|
        iot_tput_send_info_t *send_info = (iot_tput_send_info_t *)(msdu->data \
 | 
						|
            + sizeof(iot_tput_cfg_info_t));
 | 
						|
 | 
						|
        iot_printf("[tput_dbg] seq:%d,  receive_cnt:%d\n", \
 | 
						|
            send_info->seq, \
 | 
						|
            ++p_iot_tput_glb->receive_cnt);
 | 
						|
 | 
						|
        if(!p_iot_tput_glb->tput_dev.dev_ready) {
 | 
						|
            iot_printf("[tput_dbg] DEVICE NOT READY.PACKET DROPPED.\n");
 | 
						|
            break;
 | 
						|
        }
 | 
						|
 | 
						|
        if (IOT_PLC_DEV_ROLE_STA == p_iot_tput_glb->tput_dev.dev_role) {
 | 
						|
 | 
						|
            os_mem_cpy(&p_iot_tput_glb->tput_cfg, msdu->data,\
 | 
						|
                sizeof(iot_tput_cfg_info_t));
 | 
						|
 | 
						|
            iot_printf("[tput_dbg] down_up_link:%d\n", \
 | 
						|
                p_iot_tput_glb->tput_cfg.downlink);
 | 
						|
 | 
						|
            /* sta dst addr = receive src addr */
 | 
						|
            os_mem_cpy(p_iot_tput_glb->tput_cfg.dst, msdu->src, 6);
 | 
						|
 | 
						|
            if (p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_UP_LINK && \
 | 
						|
                os_mem_cmp(p_iot_tput_glb->tput_dev.cco_addr, msdu->src, 6) \
 | 
						|
                == 0 && p_iot_tput_glb->sta_send_flag == 0) {
 | 
						|
                    p_iot_tput_glb->sta_send_flag = 1;
 | 
						|
                    iot_tput_timer_start(p_iot_tput_glb->tput_send_timer, \
 | 
						|
                        IOT_TPUT_SEND_PKT_DUR);
 | 
						|
                    iot_tput_timer_start(p_iot_tput_glb->tput_period_timer, \
 | 
						|
                        IOT_TPUT_STATIS_DUR);
 | 
						|
            }
 | 
						|
            else if (p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_DOWN_LINK &&\
 | 
						|
                p_iot_tput_glb->sta_send_flag == 0) {
 | 
						|
                iot_printf("[tput_dbg] enable sta req mode\n");
 | 
						|
                p_iot_tput_glb->sta_send_flag = 1;
 | 
						|
                iot_tput_timer_start(p_iot_tput_glb->tput_req_timer, \
 | 
						|
                    IOT_TPUT_STA_REQ_DUR);   //5s
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else if (IOT_PLC_DEV_ROLE_CCO == p_iot_tput_glb->tput_dev.dev_role) {
 | 
						|
 | 
						|
            if (IOT_SEQ_INVAILD == send_info->seq && \
 | 
						|
                p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_DOWN_LINK) {
 | 
						|
 | 
						|
                p_iot_tput_glb->tput_kpbs = \
 | 
						|
                    (send_info->statistics_cnt * iot_tput_get_msdu_len() * 8)/10240;
 | 
						|
 | 
						|
                iot_printf("[tput_dbg] sta statistics_cnt:%d, tupt_kbps:%d\n", \
 | 
						|
                    send_info->statistics_cnt, p_iot_tput_glb->tput_kpbs);
 | 
						|
 | 
						|
                iot_tput_report_rate_test(msdu->src, \
 | 
						|
                    p_iot_tput_glb->tput_cfg.downlink, \
 | 
						|
                    p_iot_tput_glb->tput_kpbs);
 | 
						|
            }
 | 
						|
            else if (p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_UP_LINK && \
 | 
						|
                p_iot_tput_glb->cco_check_rece_flag == 0){
 | 
						|
                p_iot_tput_glb->cco_check_rece_flag = 1 ;
 | 
						|
                iot_tput_timer_start(p_iot_tput_glb->tput_req_timer, \
 | 
						|
                    IOT_TPUT_STA_REQ_DUR);   //5s
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    /*
 | 
						|
     * call iot_plc_set_cfg
 | 
						|
     */
 | 
						|
    case IOT_PLC_MSG_CFG_SET_CONF :
 | 
						|
    {
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_PLC_MSG_FREQ_BAND_SET_RPT:
 | 
						|
    {
 | 
						|
        /* handle freq band set response */
 | 
						|
        iot_plc_freq_band_set_rpt_t *rpt;
 | 
						|
        rpt = (iot_plc_freq_band_set_rpt_t *)(hdr + 1);
 | 
						|
        /* result = 0 :  success
 | 
						|
         * result = 2 :  fail
 | 
						|
         */
 | 
						|
        iot_printf("[tput_dbg] set_band status:%d\n", rpt->result);
 | 
						|
        if (rpt->result == 0) {
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        IOT_ASSERT(0);
 | 
						|
    }
 | 
						|
 | 
						|
    if (pkt) {
 | 
						|
        iot_pkt_free(pkt);
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
static void iot_plc_tput_handle_timer_msg(iot_tput_msg_t* task_msg)
 | 
						|
{
 | 
						|
    switch (task_msg->msg.id) {
 | 
						|
    case IOT_TIMER_SEND_PKT :
 | 
						|
    {
 | 
						|
        uint32_t msdu_len = 0;
 | 
						|
        if (p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_UP_LINK && \
 | 
						|
            IOT_PLC_DEV_ROLE_CCO == p_iot_tput_glb->tput_dev.dev_role) {
 | 
						|
            msdu_len = IOT_TPUT_LEN_72;
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            msdu_len = iot_tput_get_msdu_len();
 | 
						|
        }
 | 
						|
        iot_tput_send_pkt(p_iot_tput_glb->tput_dev.mac_addr, \
 | 
						|
            p_iot_tput_glb->tput_cfg.dst, msdu_len);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_TIMER_REQ :
 | 
						|
    {
 | 
						|
        if (IOT_PLC_DEV_ROLE_CCO == p_iot_tput_glb->tput_dev.dev_role && \
 | 
						|
            p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_UP_LINK) {
 | 
						|
 | 
						|
            p_iot_tput_glb->tput_kpbs = \
 | 
						|
                (p_iot_tput_glb->sta_last_rece_cnt * iot_tput_get_msdu_len() * 8)/10240;
 | 
						|
 | 
						|
            iot_printf("[tput_dbg] cco statistics_cnt:%d, tupt_kbps:%d\n", \
 | 
						|
                p_iot_tput_glb->sta_last_rece_cnt, p_iot_tput_glb->tput_kpbs);
 | 
						|
 | 
						|
            iot_tput_report_rate_test(p_iot_tput_glb->tput_cfg.dst, \
 | 
						|
                p_iot_tput_glb->tput_cfg.downlink,\
 | 
						|
                p_iot_tput_glb->tput_kpbs);
 | 
						|
        }
 | 
						|
        else if (IOT_PLC_DEV_ROLE_STA == p_iot_tput_glb->tput_dev.dev_role &&\
 | 
						|
            p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_DOWN_LINK) {
 | 
						|
            iot_tput_sta_req();
 | 
						|
        }
 | 
						|
 | 
						|
        if (p_iot_tput_glb->sta_last_rece_cnt != p_iot_tput_glb->receive_cnt ) {
 | 
						|
            p_iot_tput_glb->sta_last_rece_cnt = p_iot_tput_glb->receive_cnt;
 | 
						|
            iot_tput_timer_start(p_iot_tput_glb->tput_req_timer, \
 | 
						|
                IOT_TPUT_STA_REQ_DUR);   //5s
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            p_iot_tput_glb->receive_cnt = 0;
 | 
						|
            p_iot_tput_glb->sta_send_flag = 0;
 | 
						|
            iot_tput_timer_stop(p_iot_tput_glb->tput_req_timer);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        IOT_ASSERT(0);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void iot_tput_task_handle_event(iot_task_h task_h, uint32_t event)
 | 
						|
{
 | 
						|
    (void)task_h;
 | 
						|
    (void)event;
 | 
						|
 | 
						|
    /* No event implements yet. */
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
static void iot_tput_handle_cli_msg(iot_tput_msg_t *sg_msg)
 | 
						|
{
 | 
						|
    iot_pkt_t *pkt = (iot_pkt_t *)sg_msg->data;
 | 
						|
    iot_cli_tput_msg_header_t *hdr;
 | 
						|
 | 
						|
    hdr = (iot_cli_tput_msg_header_t *)iot_pkt_block_ptr(pkt, IOT_PKT_BLOCK_HEAD);
 | 
						|
    switch (hdr->msg_id) {
 | 
						|
    case IOT_CLI_SG_MSG_TEST_TPUT:
 | 
						|
    {
 | 
						|
        /*clear flag and cnt */
 | 
						|
        p_iot_tput_glb->sta_send_flag = 0;
 | 
						|
        p_iot_tput_glb->receive_cnt = 0;
 | 
						|
        p_iot_tput_glb->send_cnt = 0;
 | 
						|
 | 
						|
        uint8_t *tmp = iot_pkt_block_ptr(pkt, IOT_PKT_BLOCK_DATA);
 | 
						|
        os_mem_cpy(&p_iot_tput_glb->tput_cfg, tmp, sizeof(iot_tput_cfg_info_t));
 | 
						|
 | 
						|
        iot_printf("[tput_dbg] test_id:%d, down_up_link:%d, pkt_len:%d\n",\
 | 
						|
            p_iot_tput_glb->tput_cfg.test_id,
 | 
						|
            p_iot_tput_glb->tput_cfg.downlink, \
 | 
						|
            p_iot_tput_glb->tput_cfg.msdu_size);
 | 
						|
 | 
						|
        if (p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_DOWN_LINK && \
 | 
						|
            (IOT_PLC_DEV_ROLE_CCO == p_iot_tput_glb->tput_dev.dev_role)) {
 | 
						|
            /* in down link mode.
 | 
						|
             * cco each 10ms sends a package, a total of 10s
 | 
						|
             */
 | 
						|
            iot_tput_timer_start(p_iot_tput_glb->tput_send_timer, \
 | 
						|
                IOT_TPUT_SEND_PKT_DUR);
 | 
						|
            iot_tput_timer_start(p_iot_tput_glb->tput_period_timer, \
 | 
						|
                IOT_TPUT_STATIS_DUR);
 | 
						|
        }
 | 
						|
        else if (p_iot_tput_glb->tput_cfg.downlink == IOT_TPUT_UP_LINK && \
 | 
						|
            (IOT_PLC_DEV_ROLE_CCO == p_iot_tput_glb->tput_dev.dev_role)) {
 | 
						|
            /* in up link mode.
 | 
						|
             * cco each 10ms sends a package, a total of 10*10ms.
 | 
						|
             * total 10 pkt to notice sta send pkt.
 | 
						|
             */
 | 
						|
            iot_tput_timer_start(p_iot_tput_glb->tput_send_timer, \
 | 
						|
                IOT_TPUT_SEND_PKT_DUR);
 | 
						|
            iot_tput_timer_start(p_iot_tput_glb->tput_period_timer, \
 | 
						|
                IOT_TPUT_STATIS_TG_DUR);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        IOT_ASSERT(0);
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
static void iot_tput_task_handle_msg(iot_task_h task_h, iot_task_msg_t *msg)
 | 
						|
{
 | 
						|
    iot_tput_msg_t *task_msg;
 | 
						|
    IOT_ASSERT(task_h == p_iot_tput_glb->handle);
 | 
						|
    IOT_ASSERT(msg);
 | 
						|
 | 
						|
    task_msg = (iot_tput_msg_t*)msg;
 | 
						|
 | 
						|
    switch (task_msg->msg.type) {
 | 
						|
    case IOT_TPUT_PLC_MSG :
 | 
						|
    {
 | 
						|
        iot_plc_tput_handle_mac_msg(task_msg->data);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_TPUT_TIMER_MSG :
 | 
						|
    {
 | 
						|
        iot_plc_tput_handle_timer_msg(task_msg);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_TPUT_CLI_MSG :
 | 
						|
    {
 | 
						|
        iot_tput_handle_cli_msg(task_msg);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        IOT_ASSERT(0);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_task_free_msg(p_iot_tput_glb->handle, msg);
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
static void iot_tput_task_handle_msg_cancel(iot_task_h task_h, \
 | 
						|
    iot_task_msg_t *msg)
 | 
						|
{
 | 
						|
    iot_tput_msg_t *task_msg;
 | 
						|
    IOT_ASSERT(task_h == p_iot_tput_glb->handle);
 | 
						|
    IOT_ASSERT(msg);
 | 
						|
 | 
						|
    task_msg = (iot_tput_msg_t*)msg;
 | 
						|
    switch (task_msg->msg.type) {
 | 
						|
    case IOT_TPUT_PLC_MSG :
 | 
						|
    {
 | 
						|
        if (task_msg->data) {
 | 
						|
            iot_pkt_free(task_msg->data);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_TPUT_TIMER_MSG :
 | 
						|
    {
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    case IOT_TPUT_CLI_MSG :
 | 
						|
    {
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_task_free_msg(p_iot_tput_glb->handle, msg);
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_tput_timer_start(timer_id_t timer_id, uint32_t dur)
 | 
						|
{
 | 
						|
    os_start_timer(timer_id, dur); // 10ms
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_tput_timer_stop(timer_id_t timer_id)
 | 
						|
{
 | 
						|
    os_stop_timer(timer_id);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void iot_tput_send_timer_handle(timer_id_t timer_id, void * arg)
 | 
						|
{
 | 
						|
    (void)arg;
 | 
						|
    iot_tput_send_msg(IOT_TPUT_TIMER_MSG, IOT_TIMER_SEND_PKT, 0);
 | 
						|
}
 | 
						|
 | 
						|
void iot_tput_period_timer_handle(timer_id_t timer_id, void * arg)
 | 
						|
{
 | 
						|
    (void)arg;
 | 
						|
    p_iot_tput_glb->sta_send_flag = 0;
 | 
						|
    p_iot_tput_glb->receive_cnt = 0;
 | 
						|
    p_iot_tput_glb->send_cnt = 0;
 | 
						|
    p_iot_tput_glb->cco_check_rece_flag = 0;
 | 
						|
 | 
						|
    iot_tput_timer_stop(p_iot_tput_glb->tput_send_timer);
 | 
						|
    iot_tput_timer_stop(timer_id);
 | 
						|
}
 | 
						|
 | 
						|
void iot_tput_req_timer_handle(timer_id_t timer_id, void * arg)
 | 
						|
{
 | 
						|
    (void)arg;
 | 
						|
    iot_tput_timer_stop(timer_id);
 | 
						|
    iot_tput_send_msg(IOT_TPUT_TIMER_MSG, IOT_TIMER_REQ, 0);
 | 
						|
}
 | 
						|
 | 
						|
static void iot_sg_tput_cli_callback(void *param, iot_pkt_t *pkt)
 | 
						|
{
 | 
						|
    (void)param;
 | 
						|
    iot_tput_send_msg(IOT_TPUT_CLI_MSG, 0, pkt);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_tput_task_init()
 | 
						|
{
 | 
						|
    uint32_t ret = 0;
 | 
						|
 | 
						|
    p_iot_tput_glb = os_mem_malloc(IOT_TPUT_MID, sizeof(iot_tput_global_t));
 | 
						|
    if (p_iot_tput_glb == NULL) {
 | 
						|
        ret = ERR_NOMEM;
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_task_config_t *cfg = &p_iot_tput_glb->cfg;
 | 
						|
 | 
						|
    p_iot_tput_glb->app_handle = NULL;
 | 
						|
    p_iot_tput_glb->tput_dev.link_id = IOT_TPUT_TASK_LIKE_ID;
 | 
						|
    p_iot_tput_glb->tput_dev.dev_role = IOT_PLC_DEV_ROLE_INVALID;
 | 
						|
    //p_iot_tput_glb->nid = IOT_TPUT_NID;
 | 
						|
 | 
						|
    cfg->stack_size = 0;
 | 
						|
    cfg->task_prio = IOT_TPUT_TASK_PRIO;
 | 
						|
    cfg->msg_size = sizeof(iot_tput_msg_t);
 | 
						|
    cfg->msg_cnt = IOT_TPUT_TASK_POOL_SIZE;
 | 
						|
    cfg->queue_cnt = IOT_TPUT_TASK_QUEUE_MAX_PRIO;
 | 
						|
    cfg->queue_cfg[IOT_TPUT_TASK_QUEUE_HP].quota = 0;
 | 
						|
    cfg->queue_cfg[IOT_TPUT_TASK_QUEUE_LP].quota = 0;
 | 
						|
    cfg->task_event_func = iot_tput_task_handle_event;
 | 
						|
    cfg->msg_exe_func = iot_tput_task_handle_msg;
 | 
						|
    cfg->msg_cancel_func = iot_tput_task_handle_msg_cancel;
 | 
						|
 | 
						|
    p_iot_tput_glb->handle = iot_task_create(IOT_TPUT_MID, &p_iot_tput_glb->cfg);
 | 
						|
 | 
						|
    if (p_iot_tput_glb->handle == NULL) {
 | 
						|
        ret = ERR_FAIL;
 | 
						|
        goto err_hdl;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_plc_app_t  iot_tput_app = {0};
 | 
						|
    iot_tput_app.app_id = IOT_TPUT_APP_ID;
 | 
						|
    iot_tput_app.param = NULL;
 | 
						|
    iot_tput_app.prio = 3;
 | 
						|
    iot_tput_app.recv = iot_plc_recv_tput;
 | 
						|
 | 
						|
    p_iot_tput_glb->app_handle = iot_plc_register_app(&iot_tput_app);
 | 
						|
    if (p_iot_tput_glb->app_handle == NULL) {
 | 
						|
        ret = ERR_FAIL;
 | 
						|
        goto app_err;
 | 
						|
    }
 | 
						|
 | 
						|
    p_iot_tput_glb->tput_send_timer = os_create_timer(IOT_TPUT_MID, true, \
 | 
						|
                iot_tput_send_timer_handle, p_iot_tput_glb);
 | 
						|
    if (p_iot_tput_glb->tput_send_timer == 0) {
 | 
						|
        ret = ERR_FAIL;
 | 
						|
        iot_printf("create send timer fail \n");
 | 
						|
        goto timer_err1;
 | 
						|
    }
 | 
						|
 | 
						|
    p_iot_tput_glb->tput_period_timer = os_create_timer(IOT_TPUT_MID, true, \
 | 
						|
                iot_tput_period_timer_handle, p_iot_tput_glb);
 | 
						|
    if (p_iot_tput_glb->tput_send_timer == 0) {
 | 
						|
        ret = ERR_FAIL;
 | 
						|
        iot_printf("create timer fail \n");
 | 
						|
        goto timer_err2;
 | 
						|
    }
 | 
						|
    p_iot_tput_glb->tput_req_timer = os_create_timer(IOT_TPUT_MID, true, \
 | 
						|
                iot_tput_req_timer_handle, p_iot_tput_glb);
 | 
						|
    if (p_iot_tput_glb->tput_req_timer == 0) {
 | 
						|
        ret = ERR_FAIL;
 | 
						|
        iot_printf("create timer fail \n");
 | 
						|
        goto timer_err3;
 | 
						|
    }
 | 
						|
 | 
						|
    /* register to cli module */
 | 
						|
    p_iot_tput_glb->cli_tput_interface.recv = iot_sg_tput_cli_callback;
 | 
						|
    p_iot_tput_glb->cli_tput_interface.param = p_iot_tput_glb;
 | 
						|
    ret = iot_cli_tput_interface_register(&p_iot_tput_glb->cli_tput_interface);
 | 
						|
    if (ret) {
 | 
						|
        ret = ERR_NOMEM;
 | 
						|
        goto reg_err;
 | 
						|
    }
 | 
						|
 | 
						|
#if PLC_SUPPORT_CCO_ROLE
 | 
						|
    iot_plc_cfg_set_req_t plc_cfg = {0};
 | 
						|
    plc_cfg.reset = 1;
 | 
						|
    plc_cfg.dev_type_valid = 1;
 | 
						|
    plc_cfg.dev_type = IOT_PLC_DEV_TYPE_CONCENTRATOR;
 | 
						|
    plc_cfg.addr_valid = 1;
 | 
						|
    iot_plc_set_cfg(p_iot_tput_glb->app_handle, IOT_PLC_API_REQ_ID_DEFAULT, &plc_cfg);
 | 
						|
#endif
 | 
						|
 | 
						|
#if PLC_SUPPORT_STA_ROLE
 | 
						|
    iot_plc_cfg_set_req_t plc_cfg = {0};
 | 
						|
    plc_cfg.reset = 1;
 | 
						|
    plc_cfg.dev_type_valid = 1;
 | 
						|
    plc_cfg.dev_type = IOT_PLC_DEV_TYPE_METER_CONTROLLER;
 | 
						|
    plc_cfg.addr_valid = 1;
 | 
						|
    plc_cfg.addr_type = IOT_PLC_MAC_ADDR_TYPE_METER;
 | 
						|
    iot_plc_set_cfg(p_iot_tput_glb->app_handle, IOT_PLC_API_REQ_ID_DEFAULT, &plc_cfg);
 | 
						|
#endif
 | 
						|
 | 
						|
    goto out;
 | 
						|
 | 
						|
reg_err:
 | 
						|
 | 
						|
timer_err3:
 | 
						|
    os_delete_timer(p_iot_tput_glb->tput_period_timer);
 | 
						|
    p_iot_tput_glb->tput_period_timer = 0;
 | 
						|
timer_err2:
 | 
						|
    os_delete_timer(p_iot_tput_glb->tput_send_timer);
 | 
						|
    p_iot_tput_glb->tput_send_timer = 0;
 | 
						|
timer_err1:
 | 
						|
 | 
						|
app_err:
 | 
						|
 | 
						|
err_hdl:
 | 
						|
    os_mem_free(p_iot_tput_glb);
 | 
						|
out:
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t app_tput_entry()
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_PENDING;
 | 
						|
    iot_printf("[tput_dbg] %s\n", __FUNCTION__);
 | 
						|
    if (iot_tput_task_init()) {
 | 
						|
        ret = ERR_OK;
 | 
						|
    }
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
/* test pkt */
 | 
						|
uint32_t iot_tput_send_pkt(uint8_t *src_addr, uint8_t *dst_addr,
 | 
						|
    uint32_t msdu_len)
 | 
						|
{
 | 
						|
    iot_pkt_t*msdu_pkt;
 | 
						|
    uint8_t* ptr;
 | 
						|
    iot_printf("[tput_dbg] send_cnt:%d\n", ++p_iot_tput_glb->send_cnt);
 | 
						|
 | 
						|
    msdu_pkt = iot_plc_alloc_msdu(p_iot_tput_glb->app_handle,
 | 
						|
                IOT_PLC_MSG_TYPE_UNICAST, IOT_PLC_ACK_TYPE_NONE, \
 | 
						|
                dst_addr, src_addr, \
 | 
						|
                p_iot_tput_glb->tput_dev.link_id,
 | 
						|
                msdu_len, IOT_PLC_LOCAL_RETRY_CNT);
 | 
						|
    ptr = iot_pkt_block_ptr(msdu_pkt, IOT_PKT_BLOCK_TAIL);
 | 
						|
 | 
						|
    os_mem_set(ptr, 0x55, msdu_len);
 | 
						|
 | 
						|
    os_mem_cpy(ptr, &p_iot_tput_glb->tput_cfg, sizeof(iot_tput_cfg_info_t));
 | 
						|
 | 
						|
    iot_tput_send_info_t send_info = { 0 };
 | 
						|
    send_info.seq = p_iot_tput_glb->send_cnt;
 | 
						|
 | 
						|
    os_mem_cpy(ptr + sizeof(iot_tput_cfg_info_t), &send_info, \
 | 
						|
        sizeof(iot_tput_send_info_t));
 | 
						|
 | 
						|
    iot_pkt_put(msdu_pkt, msdu_len);
 | 
						|
 | 
						|
    iot_plc_send_msdu(p_iot_tput_glb->app_handle, msdu_pkt);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* for sta request receive how many cnt */
 | 
						|
uint32_t iot_tput_sta_req()
 | 
						|
{
 | 
						|
    iot_pkt_t*msdu_pkt;
 | 
						|
    uint8_t* ptr;
 | 
						|
    uint32_t msdu_len = IOT_TPUT_LEN_72;
 | 
						|
    msdu_pkt = iot_plc_alloc_msdu(p_iot_tput_glb->app_handle,
 | 
						|
                IOT_PLC_MSG_TYPE_BCAST_1HOP, IOT_PLC_ACK_TYPE_NONE, \
 | 
						|
                p_iot_tput_glb->tput_dev.cco_addr, \
 | 
						|
                p_iot_tput_glb->tput_dev.mac_addr, \
 | 
						|
                p_iot_tput_glb->tput_dev.link_id,
 | 
						|
                msdu_len, IOT_PLC_LOCAL_RETRY_CNT);
 | 
						|
    ptr = iot_pkt_block_ptr(msdu_pkt, IOT_PKT_BLOCK_TAIL);
 | 
						|
 | 
						|
    os_mem_set(ptr, 0x55, msdu_len);
 | 
						|
 | 
						|
    os_mem_cpy(ptr, &p_iot_tput_glb->tput_cfg, sizeof(iot_tput_cfg_info_t));
 | 
						|
 | 
						|
    iot_tput_send_info_t send_info = { 0 };
 | 
						|
    send_info.seq = IOT_SEQ_INVAILD;
 | 
						|
    send_info.statistics_cnt = p_iot_tput_glb->receive_cnt;
 | 
						|
 | 
						|
    os_mem_cpy(ptr + sizeof(iot_tput_cfg_info_t), &send_info, \
 | 
						|
        sizeof(iot_tput_send_info_t));
 | 
						|
 | 
						|
    iot_pkt_put(msdu_pkt, msdu_len);
 | 
						|
 | 
						|
    iot_plc_send_msdu(p_iot_tput_glb->app_handle, msdu_pkt);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* cco report rate to cli */
 | 
						|
void iot_tput_report_rate_test(uint8_t *dst, uint8_t down_or_up_link, \
 | 
						|
    uint32_t rate_kpbs)
 | 
						|
{
 | 
						|
    iot_pkt_t           *buf_pkt = NULL;
 | 
						|
    uint32_t rsp_len  = sizeof(iot_cli_tput_msg_header_t) +\
 | 
						|
        sizeof(iot_cli_tput_report_t);
 | 
						|
 | 
						|
    buf_pkt = iot_pkt_alloc(rsp_len, IOT_TPUT_MID);
 | 
						|
    IOT_ASSERT(buf_pkt);
 | 
						|
 | 
						|
    iot_pkt_put(buf_pkt,rsp_len);
 | 
						|
 | 
						|
    uint8_t *tmp = iot_pkt_block_ptr(buf_pkt, IOT_PKT_BLOCK_HEAD);
 | 
						|
 | 
						|
    iot_cli_tput_msg_header_t *hd = (iot_cli_tput_msg_header_t *)tmp;
 | 
						|
    hd->msg_id = IOT_CLI_TPUT_REQ;
 | 
						|
    hd->req_id = 0;
 | 
						|
 | 
						|
    iot_cli_tput_report_t *result = (iot_cli_tput_report_t *)(tmp + \
 | 
						|
        sizeof(iot_cli_tput_msg_header_t));
 | 
						|
    result->test_id = 1;  //report tput value
 | 
						|
    result->down_or_up_link = down_or_up_link;
 | 
						|
    result->tput_valu = rate_kpbs;
 | 
						|
    iot_mac_addr_cpy(result->dst, dst);
 | 
						|
    iot_cli_tput_send_data_to_cli_interface(buf_pkt);
 | 
						|
    return ;
 | 
						|
}
 | 
						|
#endif
 |