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
|