1278 lines
37 KiB
C
Executable File
1278 lines
37 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 "os_task_api.h"
|
|
#include "os_event_api.h"
|
|
#include "os_timer_api.h"
|
|
#include "os_utils_api.h"
|
|
#include "iot_task_api.h"
|
|
#include "iot_module_api.h"
|
|
#include "os_lock_api.h"
|
|
#include "iot_plc_cco_api.h"
|
|
#include "iot_plc_sta_api.h"
|
|
#include "iot_config_api.h"
|
|
#include "iot_app_api.h"
|
|
#include "iot_errno_api.h"
|
|
#include "iot_io_api.h"
|
|
#include "iot_flash_api.h"
|
|
#include "iot_uart_api.h"
|
|
#include "iot_utils_api.h"
|
|
#include "iot_oem_api.h"
|
|
#include "iot_board_api.h"
|
|
#include "iot_gpio_api.h"
|
|
#include "iot_adc_api.h"
|
|
#include "demo.h"
|
|
#include "demo_speed_test.h"
|
|
|
|
/*
|
|
LIGHT WORDS:
|
|
|
|
1 -> LIGHT ON , 0 -> LIGHT OFF.
|
|
|
|
A: PREPARE
|
|
GR : | 01010101 |
|
|
RD : | 01010101 |
|
|
|
|
B: IN TEST
|
|
GR : | 01010101 |
|
|
RD : | 10101010 |
|
|
|
|
C: REPORT THE SPEED
|
|
IF SPEED LEVEL IS 500Kbps (450Kbps ~ 550Kbps) :
|
|
UCAST :
|
|
| PRE | SPEED |
|
|
GR : | 00000000 | 0101010101 |
|
|
RD : | 00111100 | 0000000000 |
|
|
BCAST :
|
|
| PRE | SPEED |
|
|
GR : | 00111100 | 0000000000 |
|
|
RD : | 00000000 | 0101010101 |
|
|
|
|
*/
|
|
|
|
#define APP_DEMO_SPD_CCO_MAC {0x48, 0x55, 0x5C, 0xAA, 0xBB, 0xCC}
|
|
#define APP_DEMO_SPD_STA_MAC {0x48, 0x55, 0x5C, 0xCC, 0xDD, 0xEE}
|
|
|
|
#define APP_DEMO_SPD_TMR_INTVAL 500 /* 500ms */
|
|
#define APP_DEMO_SPD_TEST_BUFFER_LEN 1024
|
|
|
|
#define APP_DEMO_SPD_TIMEOUT_MAX 20 /* 10 seconds */
|
|
|
|
/* ucast && bcast */
|
|
#define APP_DEMO_SPD_CAST_NUM 2
|
|
|
|
#if (IOT_DEMO_SUB_FUN == IOT_DEMO_SEL_SPEED_TEST)
|
|
|
|
#if INCLUDE_APP_DEMO_SPD_SENDER
|
|
|
|
/***************** CONFIG AREA START *********************/
|
|
/* [6/7/8] ms * [64/128/256/512/1024]Kbps */
|
|
const uint32_t g_demo_spd_interval[] = {6, 7, 8};
|
|
const uint32_t g_demo_spd_speed[] = {128, 256, 320, 448, 512, 640};
|
|
#define APP_DEMO_SPD_TEST_PACKET_NUM 500
|
|
/***************** CONFIG AREA END *********************/
|
|
|
|
#define APP_DEMO_SPD_INTVL_NUM \
|
|
(sizeof(g_demo_spd_interval)/sizeof(g_demo_spd_interval[0]))
|
|
|
|
#define APP_DEMO_SPD_SPEED_NUM \
|
|
(sizeof(g_demo_spd_speed)/sizeof(g_demo_spd_speed[0]))
|
|
|
|
typedef struct app_demo_spd_info_t
|
|
{
|
|
uint16_t speed; /* Kbps */
|
|
uint8_t is_bcast;
|
|
uint8_t interval; /* ms */
|
|
uint16_t pkt_size; /* bytes */
|
|
uint16_t rcv_used_time;
|
|
uint32_t rcv_bytes;
|
|
uint32_t rcv_pkts;
|
|
uint32_t pkt_lost_rate;
|
|
}spd_info_t;
|
|
|
|
spd_info_t g_app_demo_spd_test_items[APP_DEMO_SPD_CAST_NUM][APP_DEMO_SPD_SPEED_NUM][APP_DEMO_SPD_INTVL_NUM];
|
|
|
|
const uint8_t app_demo_mac_local[] = APP_DEMO_SPD_CCO_MAC;
|
|
const uint8_t app_demo_mac_remote[] = APP_DEMO_SPD_STA_MAC;
|
|
|
|
#else /* INCLUDE_APP_DEMO_SPD_SENDER */
|
|
uint32_t g_app_demo_spd_rcvd_bytes;
|
|
uint32_t g_app_demo_spd_rcvd_packets;
|
|
|
|
const uint8_t app_demo_mac_local[] = APP_DEMO_SPD_STA_MAC;
|
|
const uint8_t app_demo_mac_remote[] = APP_DEMO_SPD_CCO_MAC;
|
|
|
|
#endif /* INCLUDE_APP_DEMO_SPD_SENDER */
|
|
|
|
typedef struct iot_app_demo_spd_msg
|
|
{
|
|
iot_task_msg_t msg; /* The main entity of message. */
|
|
void *data; /* The user data inside this message. */
|
|
}demo_spd_msg_t;
|
|
|
|
uint8_t app_demo_spd_buf[APP_DEMO_SPD_TEST_BUFFER_LEN];
|
|
|
|
#define APP_DEMO_RDY_REG 0x01
|
|
#define APP_DEMO_RDY_LOCAL 0x02
|
|
#define APP_DEMO_RDY_REMOTE 0x04
|
|
#define APP_DEMO_RDY_WL 0x08
|
|
|
|
#define APP_DEMO_RDY_RESTART 0x10
|
|
#define APP_DEMO_RDY_IDLE 0x20
|
|
#define APP_DEMO_RDY_TEST 0x40
|
|
#define APP_DEMO_RDY_S_REPORT 0x80 /* Wait or send single report. */
|
|
#define APP_DEMO_RDY_FINISH 0x100
|
|
|
|
iot_plc_app_h app_demo_spd_app_handle;
|
|
iot_task_h app_demo_spd_task_handle;
|
|
volatile uint32_t app_demo_spd_ready;
|
|
uint32_t app_demo_spd_current_key = 0x67676767;
|
|
|
|
#define APP_DEMO_SPD_READY() \
|
|
(((APP_DEMO_RDY_WL|APP_DEMO_RDY_REMOTE|APP_DEMO_RDY_LOCAL|APP_DEMO_RDY_REG)\
|
|
& app_demo_spd_ready) == \
|
|
(APP_DEMO_RDY_WL|APP_DEMO_RDY_REMOTE|APP_DEMO_RDY_LOCAL|APP_DEMO_RDY_REG) ? \
|
|
1 : 0)
|
|
|
|
#define APP_DEMO_SPD_RESTART() \
|
|
(((APP_DEMO_RDY_WL|APP_DEMO_RDY_REMOTE|APP_DEMO_RDY_LOCAL|APP_DEMO_RDY_REG|APP_DEMO_RDY_RESTART)\
|
|
& app_demo_spd_ready) == \
|
|
(APP_DEMO_RDY_WL|APP_DEMO_RDY_REMOTE|APP_DEMO_RDY_LOCAL|APP_DEMO_RDY_REG|APP_DEMO_RDY_RESTART) ? \
|
|
1 : 0)
|
|
|
|
#define APP_DEMO_SPD_CLEAR_STATUS() \
|
|
(app_demo_spd_ready &= ~(APP_DEMO_RDY_RESTART | APP_DEMO_RDY_IDLE \
|
|
| APP_DEMO_RDY_TEST | APP_DEMO_RDY_S_REPORT | APP_DEMO_RDY_FINISH))
|
|
|
|
#define APP_DEMO_SPD_HEADER_FLAG 0xEA5E94CD
|
|
|
|
uint32_t app_demo_spd_led_red;
|
|
uint32_t app_demo_spd_led_green;
|
|
|
|
timer_id_t app_demo_spd_led_tmr;
|
|
timer_id_t app_demo_spd_trcvd_tmr;
|
|
|
|
#define APP_DEMO_SPD_EVT_LED_TMR 0x01
|
|
#define APP_DEMO_SPD_EVT_TRSVD_TMR 0x02
|
|
|
|
|
|
enum app_demo_spd_header_type_e
|
|
{
|
|
HDR_TYPE_TESTING = 0x5A5A,
|
|
HDR_TYPE_S_REPORT= 0x7E7E,
|
|
HDR_TYPE_F_REPORT= 0xD6D6,
|
|
};
|
|
|
|
/* Sender -> Receiver */
|
|
typedef struct app_demo_spd_test_header_t
|
|
{
|
|
uint32_t flag;
|
|
uint16_t type;
|
|
|
|
uint16_t time_left_ms;
|
|
uint32_t cur_key;
|
|
uint32_t index;
|
|
}spd_t_hr_t;
|
|
|
|
/* Receiver -> Sender */
|
|
typedef struct app_demo_spd_single_report_header_t
|
|
{
|
|
uint32_t flag;
|
|
uint16_t type;
|
|
|
|
uint16_t time;
|
|
uint32_t cur_key;
|
|
uint32_t bytes;
|
|
uint32_t packets;
|
|
}spd_s_hr_t;
|
|
|
|
/* Sender -> Receiver */
|
|
typedef struct app_demo_spd_final_report_header_t
|
|
{
|
|
uint32_t flag;
|
|
uint16_t type;
|
|
|
|
uint16_t bcast;
|
|
uint16_t intval;
|
|
uint16_t speed; /* Test speed for sender. */
|
|
uint16_t pkt_size;
|
|
uint16_t final_speed; /* receive speed for receiver. We trust this speed. */
|
|
uint32_t pkt_lost_rate; /* 8888 -> 88.88% */
|
|
}spd_f_hr_t;
|
|
|
|
spd_f_hr_t app_demo_spd_winner[APP_DEMO_SPD_CAST_NUM];
|
|
|
|
#define APP_DEMO_SPD_LW_STEPS_MAX 64
|
|
|
|
typedef struct app_demo_spd_light_words
|
|
{
|
|
uint16_t steps; /* Steps to run out of a final report. */
|
|
uint16_t pos; /* current step */
|
|
uint32_t green[APP_DEMO_SPD_LW_STEPS_MAX/32]; /* BIT map for LED, 1 -> light on , 0 -> off */
|
|
uint32_t red[APP_DEMO_SPD_LW_STEPS_MAX/32]; /* BIT map for LED, 1 -> light on , 0 -> off */
|
|
}light_wd_t;
|
|
|
|
light_wd_t g_app_demo_spd_lght_words;
|
|
|
|
inline static void app_demo_spd_print_iterm(spd_f_hr_t *p_iterm, uint32_t banner)
|
|
{
|
|
if(banner)
|
|
{
|
|
iot_cus_printf(
|
|
"\n SPEED(KbPS) CAST INTVAL(MS) PKT-SIZE(B) PKT-LOST TRUE-SPEED(Kbps)");
|
|
}
|
|
|
|
iot_cus_printf(
|
|
"\n %5d %c %6d %8d %2d.%02d%% %10d",
|
|
p_iterm->speed,
|
|
p_iterm->bcast ? 'B' : 'U',
|
|
p_iterm->intval,
|
|
p_iterm->pkt_size,
|
|
p_iterm->pkt_lost_rate/100,
|
|
p_iterm->pkt_lost_rate%100,
|
|
p_iterm->final_speed);
|
|
}
|
|
|
|
uint32_t app_demo_set_band(uint8_t band_id)
|
|
{
|
|
|
|
iot_cus_printf("%s: set band to band %d\n", __FUNCTION__, band_id);
|
|
|
|
iot_plc_set_freq_band(app_demo_spd_app_handle,
|
|
IOT_PLC_API_REQ_ID_DEFAULT, band_id);
|
|
|
|
return ERR_OK;
|
|
}
|
|
|
|
/* set sta scan band */
|
|
void app_demo_set_sta_scan_band(uint8_t band_id)
|
|
{
|
|
iot_cus_printf("%s: set scan band to band %d\n", __FUNCTION__, band_id);
|
|
uint8_t fb_bitmap[IOT_PLC_BAND_BITMAP_SIZE] = { 0 };
|
|
|
|
fb_bitmap[band_id / 8] |= 1 << (band_id % 8);
|
|
|
|
iot_plc_set_scan_band_bitmap(app_demo_spd_app_handle,
|
|
IOT_PLC_API_REQ_ID_DEFAULT, fb_bitmap, IOT_PLC_BAND_BITMAP_SIZE);
|
|
}
|
|
|
|
void app_demo_spd_plc_send(uint8_t *p_buf, uint32_t size, uint32_t bcast)
|
|
{
|
|
iot_pkt_t *msdu_pkt;
|
|
uint8_t *ptr;
|
|
|
|
if(bcast)
|
|
{
|
|
msdu_pkt = iot_plc_alloc_msdu(app_demo_spd_app_handle,
|
|
IOT_PLC_MSG_TYPE_BCAST, IOT_PLC_ACK_TYPE_NONE,
|
|
NULL,
|
|
(uint8_t *)app_demo_mac_local,
|
|
DEMO_APP_LINK_ID, size, 1);
|
|
}
|
|
else
|
|
{
|
|
msdu_pkt = iot_plc_alloc_msdu(app_demo_spd_app_handle,
|
|
IOT_PLC_MSG_TYPE_UNICAST, IOT_PLC_ACK_TYPE_NONE,
|
|
(uint8_t *)app_demo_mac_remote,
|
|
(uint8_t *)app_demo_mac_local,
|
|
DEMO_APP_LINK_ID, size, 0);
|
|
}
|
|
|
|
if(NULL == msdu_pkt)
|
|
{
|
|
DEMO_ERROR("ALLOC PACKET FAILED !!", 1,2,3,4,5,6);
|
|
return;
|
|
}
|
|
|
|
ptr = iot_pkt_block_ptr(msdu_pkt, IOT_PKT_BLOCK_TAIL);
|
|
|
|
os_mem_cpy(ptr, p_buf, size);
|
|
|
|
iot_pkt_put(msdu_pkt, size);
|
|
|
|
/* Forword to PLC. */
|
|
iot_plc_send_msdu(app_demo_spd_app_handle, msdu_pkt);
|
|
}
|
|
|
|
void app_demo_spd_make_light_words_data(void)
|
|
{
|
|
uint32_t b_speed, u_speed, red, green, i, steps;
|
|
|
|
u_speed = (((app_demo_spd_winner[0].final_speed % 100) > 50)
|
|
? ((app_demo_spd_winner[0].final_speed / 100) + 1)
|
|
: (app_demo_spd_winner[0].final_speed / 100));
|
|
|
|
b_speed = (((app_demo_spd_winner[1].final_speed % 100) > 50)
|
|
? (app_demo_spd_winner[1].final_speed / 100 + 1)
|
|
: (app_demo_spd_winner[1].final_speed / 100));
|
|
|
|
g_app_demo_spd_lght_words.steps = 8 + u_speed * 2 + 8 + b_speed * 2;
|
|
|
|
/* UCAST */
|
|
green = 0x0;
|
|
steps = 8;
|
|
red = 0x3C;
|
|
|
|
for(i = 0; i < u_speed; i++)
|
|
{
|
|
green <<= 2;
|
|
red <<= 2;
|
|
green |= 1;
|
|
}
|
|
|
|
green <<= 1;
|
|
red <<= 1;
|
|
|
|
steps += u_speed * 2 + 1;
|
|
|
|
g_app_demo_spd_lght_words.green[0] = green << (32 - steps);
|
|
g_app_demo_spd_lght_words.red[0] = red << (32 - steps);
|
|
g_app_demo_spd_lght_words.pos = steps;
|
|
|
|
/* BCAST */
|
|
red = 0x0;
|
|
steps = 7;
|
|
green = 0x3C;
|
|
|
|
for(i = 0; i < b_speed; i++)
|
|
{
|
|
red <<= 2;
|
|
green <<= 2;
|
|
red |= 1;
|
|
}
|
|
|
|
green <<= 1;
|
|
red <<= 1;
|
|
|
|
steps += b_speed * 2 + 1;
|
|
|
|
/* First 32bits left */
|
|
i = 32 - g_app_demo_spd_lght_words.pos;
|
|
|
|
if(g_app_demo_spd_lght_words.steps > 32)
|
|
{
|
|
g_app_demo_spd_lght_words.green[0] |= (green >> (steps - i));
|
|
g_app_demo_spd_lght_words.red[0] |= (red >> (steps - i));
|
|
g_app_demo_spd_lght_words.green[1] = (green << (32 - (steps - i)));
|
|
g_app_demo_spd_lght_words.red[1] = (red << (32 - (steps - i)));
|
|
}
|
|
else
|
|
{
|
|
g_app_demo_spd_lght_words.green[0] |= (green << (i - steps));
|
|
g_app_demo_spd_lght_words.red[0] |= (red << (i - steps));
|
|
}
|
|
|
|
/* Start from bit-0. */
|
|
g_app_demo_spd_lght_words.pos = 0;
|
|
|
|
DEMO_INFO("LW BITMAP RED : #0x%08x%08x, GREEN #0x%08x%08x, STEPS #%d.",
|
|
g_app_demo_spd_lght_words.red[0],
|
|
g_app_demo_spd_lght_words.red[1],
|
|
g_app_demo_spd_lght_words.green[0],
|
|
g_app_demo_spd_lght_words.green[1],
|
|
g_app_demo_spd_lght_words.steps, 6);
|
|
|
|
return;
|
|
}
|
|
|
|
#if INCLUDE_APP_DEMO_SPD_SENDER
|
|
|
|
uint32_t g_app_demo_spd_remain_pkts;
|
|
spd_info_t *p_app_demo_spd_current_item;
|
|
|
|
void app_demo_spd_mac_data_process(iot_plc_msdu_recv_t *p_msdu)
|
|
{
|
|
spd_s_hr_t *p_hdr = (spd_s_hr_t *)p_msdu->data;
|
|
uint32_t cast_inx, iterm_inx;
|
|
spd_info_t *p_iterm;
|
|
spd_f_hr_t iterm_print;
|
|
|
|
if((APP_DEMO_SPD_HEADER_FLAG != p_hdr->flag)
|
|
|| (HDR_TYPE_S_REPORT != p_hdr->type)
|
|
|| (app_demo_spd_current_key != p_hdr->cur_key)
|
|
|| (!(app_demo_spd_ready & APP_DEMO_RDY_S_REPORT)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
DEMO_INFO("Got report from remote, BYTES # %d, PKTS # %d, TIME # %d.",
|
|
p_hdr->bytes, p_hdr->packets, p_hdr->time, 4, 5, 6);
|
|
|
|
p_app_demo_spd_current_item->rcv_bytes = p_hdr->bytes;
|
|
p_app_demo_spd_current_item->rcv_pkts = p_hdr->packets;
|
|
p_app_demo_spd_current_item->rcv_used_time = p_hdr->time;
|
|
|
|
os_stop_timer(app_demo_spd_trcvd_tmr);
|
|
|
|
if(p_app_demo_spd_current_item ==
|
|
&g_app_demo_spd_test_items\
|
|
[APP_DEMO_SPD_CAST_NUM - 1][APP_DEMO_SPD_SPEED_NUM - 1][APP_DEMO_SPD_INTVL_NUM - 1])
|
|
{
|
|
/* All items finished. */
|
|
iot_cus_printf("\n\nAll test cases:");
|
|
for(cast_inx = 0; cast_inx < APP_DEMO_SPD_CAST_NUM; cast_inx++)
|
|
{
|
|
p_iterm = &g_app_demo_spd_test_items[cast_inx][0][0];
|
|
app_demo_spd_winner[cast_inx].pkt_lost_rate = 10000;
|
|
|
|
for(iterm_inx = 0; iterm_inx < APP_DEMO_SPD_SPEED_NUM*APP_DEMO_SPD_INTVL_NUM; iterm_inx++)
|
|
{
|
|
p_iterm->pkt_lost_rate = 10000 - ((p_iterm->rcv_pkts * 100) / (APP_DEMO_SPD_TEST_PACKET_NUM / 100));
|
|
|
|
iterm_print.bcast = p_iterm->is_bcast;
|
|
iterm_print.intval = p_iterm->interval;
|
|
iterm_print.speed = p_iterm->speed;
|
|
iterm_print.pkt_lost_rate = p_iterm->pkt_lost_rate;
|
|
iterm_print.pkt_size = p_iterm->pkt_size;
|
|
|
|
iterm_print.final_speed = (8 * p_iterm->rcv_bytes) / p_iterm->rcv_used_time;
|
|
|
|
/* OS ticks may not be precise. */
|
|
iterm_print.final_speed = (iterm_print.final_speed > iterm_print.speed)
|
|
? iterm_print.speed : iterm_print.final_speed;
|
|
|
|
if((app_demo_spd_winner[cast_inx].pkt_lost_rate >= iterm_print.pkt_lost_rate)
|
|
|| (p_iterm->pkt_lost_rate <= 1000))
|
|
{
|
|
os_mem_cpy(&app_demo_spd_winner[cast_inx], &iterm_print, sizeof(iterm_print));
|
|
}
|
|
|
|
if((0 != cast_inx) || (0 != iterm_inx))
|
|
{
|
|
app_demo_spd_print_iterm(&iterm_print, 0);
|
|
}
|
|
else
|
|
{
|
|
app_demo_spd_print_iterm(&iterm_print, 1);
|
|
}
|
|
p_iterm++;
|
|
}
|
|
}
|
|
APP_DEMO_SPD_CLEAR_STATUS();
|
|
|
|
app_demo_spd_make_light_words_data();
|
|
|
|
iot_cus_printf("\n\nThe best cases:");
|
|
for(cast_inx = 0; cast_inx < APP_DEMO_SPD_CAST_NUM; cast_inx++)
|
|
{
|
|
if(0 == cast_inx)
|
|
{
|
|
app_demo_spd_print_iterm(&app_demo_spd_winner[cast_inx], 1);
|
|
}
|
|
else
|
|
{
|
|
app_demo_spd_print_iterm(&app_demo_spd_winner[cast_inx], 0);
|
|
}
|
|
}
|
|
|
|
/* Start timer to send finally report */
|
|
os_start_timer(app_demo_spd_trcvd_tmr, 500);
|
|
app_demo_spd_ready |= APP_DEMO_RDY_FINISH;
|
|
}
|
|
else
|
|
{
|
|
app_demo_spd_ready &= ~APP_DEMO_RDY_S_REPORT;
|
|
p_app_demo_spd_current_item++;
|
|
g_app_demo_spd_remain_pkts = APP_DEMO_SPD_TEST_PACKET_NUM;
|
|
DEMO_INFO("Test %s : speed # %dkbps, psize # %dbytes...",
|
|
p_app_demo_spd_current_item->is_bcast ? "bcast" : "ucast",
|
|
p_app_demo_spd_current_item->speed, p_app_demo_spd_current_item->pkt_size,
|
|
4, 5, 6);
|
|
os_start_timer(app_demo_spd_trcvd_tmr, p_app_demo_spd_current_item->interval);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_trcvd_tmr_process(void)
|
|
{
|
|
static uint32_t static_cnt = APP_DEMO_SPD_TIMEOUT_MAX;
|
|
spd_t_hr_t *p_hdr;
|
|
spd_f_hr_t *p_finally_report;
|
|
|
|
if(!APP_DEMO_SPD_READY())
|
|
{
|
|
if(os_is_timer_active(app_demo_spd_trcvd_tmr))
|
|
{
|
|
os_stop_timer(app_demo_spd_trcvd_tmr);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/* Check if receiver reports the resoult. */
|
|
if(APP_DEMO_RDY_S_REPORT & app_demo_spd_ready)
|
|
{
|
|
/* If no report received, stop this testing. */
|
|
if(0 == static_cnt)
|
|
{
|
|
/* Regard this as receiver dropped. */
|
|
APP_DEMO_SPD_CLEAR_STATUS();
|
|
app_demo_spd_ready |= (APP_DEMO_RDY_IDLE | APP_DEMO_RDY_RESTART);
|
|
os_stop_timer(app_demo_spd_trcvd_tmr);
|
|
DEMO_ERROR("WAIT THE REPORT TIMEOUT !!", 1, 2,3,4,5,6);
|
|
}
|
|
else
|
|
{
|
|
static_cnt--;
|
|
}
|
|
}
|
|
else if(APP_DEMO_RDY_FINISH & app_demo_spd_ready)
|
|
{
|
|
static_cnt++;
|
|
|
|
static_cnt = (static_cnt >= APP_DEMO_SPD_CAST_NUM)? 0 : static_cnt;
|
|
|
|
p_finally_report = (spd_f_hr_t *)app_demo_spd_buf;
|
|
|
|
p_finally_report->flag = APP_DEMO_SPD_HEADER_FLAG;
|
|
p_finally_report->type = HDR_TYPE_F_REPORT;
|
|
|
|
p_finally_report->intval = app_demo_spd_winner[static_cnt].intval;
|
|
p_finally_report->bcast = app_demo_spd_winner[static_cnt].bcast;
|
|
p_finally_report->speed = app_demo_spd_winner[static_cnt].speed;
|
|
p_finally_report->pkt_size = app_demo_spd_winner[static_cnt].pkt_size;
|
|
p_finally_report->pkt_lost_rate = app_demo_spd_winner[static_cnt].pkt_lost_rate;
|
|
p_finally_report->final_speed = app_demo_spd_winner[static_cnt].final_speed;
|
|
|
|
app_demo_spd_plc_send(app_demo_spd_buf, sizeof(*p_finally_report), 0);
|
|
}
|
|
else
|
|
{
|
|
static_cnt = APP_DEMO_SPD_TIMEOUT_MAX;
|
|
}
|
|
|
|
if(g_app_demo_spd_remain_pkts > 0)
|
|
{
|
|
/* The last packet. */
|
|
if(1 == g_app_demo_spd_remain_pkts)
|
|
{
|
|
app_demo_spd_ready |= APP_DEMO_RDY_S_REPORT;
|
|
os_stop_timer(app_demo_spd_trcvd_tmr);
|
|
os_start_timer(app_demo_spd_trcvd_tmr, 500);
|
|
}
|
|
|
|
if(APP_DEMO_SPD_TEST_PACKET_NUM == g_app_demo_spd_remain_pkts)
|
|
{
|
|
p_hdr = (spd_t_hr_t *)app_demo_spd_buf;
|
|
p_hdr->flag = APP_DEMO_SPD_HEADER_FLAG;
|
|
p_hdr->type = HDR_TYPE_TESTING;
|
|
|
|
p_hdr->cur_key = os_boot_time32();
|
|
app_demo_spd_current_key = p_hdr->cur_key;
|
|
|
|
p_hdr->index = 0;
|
|
|
|
p_hdr->time_left_ms = APP_DEMO_SPD_TEST_PACKET_NUM * p_app_demo_spd_current_item->interval;
|
|
}
|
|
else
|
|
{
|
|
p_hdr->index++;
|
|
p_hdr->time_left_ms -= p_app_demo_spd_current_item->interval;
|
|
}
|
|
|
|
app_demo_spd_plc_send(app_demo_spd_buf,
|
|
p_app_demo_spd_current_item->pkt_size, p_app_demo_spd_current_item->is_bcast);
|
|
|
|
g_app_demo_spd_remain_pkts--;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_restart(void)
|
|
{
|
|
APP_DEMO_SPD_CLEAR_STATUS();
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_TEST;
|
|
|
|
p_app_demo_spd_current_item = (spd_info_t*)g_app_demo_spd_test_items;
|
|
g_app_demo_spd_remain_pkts = APP_DEMO_SPD_TEST_PACKET_NUM;
|
|
|
|
DEMO_INFO("Test %s : speed # %dkbps, psize # %dbytes...",
|
|
p_app_demo_spd_current_item->is_bcast ? "bcast" : "ucast",
|
|
p_app_demo_spd_current_item->speed, p_app_demo_spd_current_item->pkt_size,
|
|
4, 5, 6);
|
|
|
|
os_start_timer(app_demo_spd_trcvd_tmr, p_app_demo_spd_current_item->interval);
|
|
|
|
return;
|
|
}
|
|
|
|
#else
|
|
uint32_t g_app_demo_spd_test_time;
|
|
uint32_t g_app_demo_spd_end_test_time;
|
|
|
|
void app_demo_spd_mac_data_process(iot_plc_msdu_recv_t *p_msdu)
|
|
{
|
|
spd_t_hr_t *p_hdr = (spd_t_hr_t *)p_msdu->data;
|
|
spd_f_hr_t *p_f_hr;
|
|
uint32_t cast_inx;
|
|
|
|
if(APP_DEMO_SPD_HEADER_FLAG != p_hdr->flag)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(HDR_TYPE_TESTING == p_hdr->type)
|
|
{
|
|
if((app_demo_spd_current_key == p_hdr->cur_key)
|
|
&& (!(APP_DEMO_RDY_S_REPORT & app_demo_spd_ready)))
|
|
{
|
|
g_app_demo_spd_rcvd_bytes += p_msdu->len;
|
|
g_app_demo_spd_rcvd_packets++;
|
|
g_app_demo_spd_end_test_time = os_boot_time32();
|
|
}
|
|
else
|
|
{
|
|
if(os_is_timer_active(app_demo_spd_trcvd_tmr))
|
|
{
|
|
os_stop_timer(app_demo_spd_trcvd_tmr);
|
|
}
|
|
|
|
APP_DEMO_SPD_CLEAR_STATUS();
|
|
|
|
/* Clear all info since new test begains. */
|
|
for(cast_inx = 0; cast_inx < APP_DEMO_SPD_CAST_NUM; cast_inx++)
|
|
{
|
|
app_demo_spd_winner[cast_inx].speed = 0;
|
|
}
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_TEST;
|
|
|
|
g_app_demo_spd_rcvd_bytes = p_msdu->len;
|
|
g_app_demo_spd_rcvd_packets = 1;
|
|
app_demo_spd_current_key = p_hdr->cur_key;
|
|
|
|
g_app_demo_spd_test_time = (p_hdr->time_left_ms > 20000)
|
|
? 20000 : p_hdr->time_left_ms;
|
|
|
|
os_start_timer(app_demo_spd_trcvd_tmr, g_app_demo_spd_test_time * 2);
|
|
|
|
g_app_demo_spd_test_time = os_boot_time32();
|
|
|
|
DEMO_INFO("NEW TEST KEY # %d.", app_demo_spd_current_key,2,3,4,5,6);
|
|
}
|
|
}
|
|
else if((HDR_TYPE_F_REPORT == p_hdr->type)
|
|
&& (!(app_demo_spd_ready & APP_DEMO_RDY_FINISH)))
|
|
{
|
|
p_f_hr = (spd_f_hr_t *)p_msdu->data;
|
|
|
|
app_demo_spd_winner[p_f_hr->bcast ? 1 : 0] = *p_f_hr;
|
|
|
|
for(cast_inx = 0; cast_inx < APP_DEMO_SPD_CAST_NUM; cast_inx++)
|
|
{
|
|
if(0 == app_demo_spd_winner[cast_inx].speed)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(APP_DEMO_SPD_CAST_NUM == cast_inx)
|
|
{
|
|
os_stop_timer(app_demo_spd_trcvd_tmr);
|
|
|
|
APP_DEMO_SPD_CLEAR_STATUS();
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_FINISH;
|
|
|
|
app_demo_spd_make_light_words_data();
|
|
|
|
iot_cus_printf("\n\nThe best cases:");
|
|
for(cast_inx = 0; cast_inx < APP_DEMO_SPD_CAST_NUM; cast_inx++)
|
|
{
|
|
if(0 == cast_inx)
|
|
{
|
|
app_demo_spd_print_iterm(&app_demo_spd_winner[cast_inx], 1);
|
|
}
|
|
else
|
|
{
|
|
app_demo_spd_print_iterm(&app_demo_spd_winner[cast_inx], 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_trcvd_tmr_process(void)
|
|
{
|
|
spd_s_hr_t *p_rpt = (spd_s_hr_t *)app_demo_spd_buf;
|
|
uint32_t cost_time;
|
|
|
|
APP_DEMO_SPD_CLEAR_STATUS();
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_S_REPORT;
|
|
|
|
cost_time = (g_app_demo_spd_test_time < g_app_demo_spd_end_test_time)
|
|
?(g_app_demo_spd_end_test_time - g_app_demo_spd_test_time)
|
|
:(0xFFFFFFFF - g_app_demo_spd_test_time + g_app_demo_spd_end_test_time);
|
|
|
|
p_rpt->bytes = g_app_demo_spd_rcvd_bytes;
|
|
p_rpt->cur_key = app_demo_spd_current_key;
|
|
p_rpt->flag = APP_DEMO_SPD_HEADER_FLAG;
|
|
p_rpt->packets = g_app_demo_spd_rcvd_packets;
|
|
p_rpt->time = cost_time;
|
|
p_rpt->type = HDR_TYPE_S_REPORT;
|
|
|
|
DEMO_INFO("REPORT KEY # %d, TIME # %d, PKT # %d.",
|
|
app_demo_spd_current_key,
|
|
cost_time,
|
|
g_app_demo_spd_rcvd_packets,
|
|
4,5,6);
|
|
|
|
app_demo_spd_plc_send(app_demo_spd_buf, sizeof(*p_rpt), 0);
|
|
|
|
os_start_timer(app_demo_spd_trcvd_tmr, 1000);
|
|
}
|
|
|
|
#endif
|
|
|
|
uint32_t app_demo_spd_post_msg( uint16_t msg_type, uint16_t msg_id, void *data)
|
|
{
|
|
iot_task_msg_t *msg;
|
|
demo_spd_msg_t *task_msg;
|
|
|
|
msg = iot_task_alloc_msg_with_reserved(app_demo_spd_task_handle, 0);
|
|
|
|
if (NULL == msg) {
|
|
DEMO_ERROR("ALLOC MSG-BUFFER FAILED !!", 1, 2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
task_msg = (demo_spd_msg_t*)msg;
|
|
|
|
task_msg->msg.type = msg_type;
|
|
task_msg->msg.id = msg_id;
|
|
task_msg->data = data;
|
|
|
|
iot_task_queue_msg(app_demo_spd_task_handle,
|
|
&task_msg->msg, DEMO_TASK_MSG_PRIO);
|
|
|
|
return ERR_OK;
|
|
}
|
|
|
|
void app_demo_spd_mac_status_process(iot_pkt_t *pkt)
|
|
{
|
|
iot_plc_msg_header_t *hdr =
|
|
(iot_plc_msg_header_t*)iot_pkt_data(pkt);
|
|
|
|
/* Check if this packet belongs to me. */
|
|
if ((IOT_PLC_APP_ID_BCAST != hdr->app_id) &&
|
|
(IOT_PLC_APP_DEMO_ID != hdr->app_id))
|
|
{
|
|
DEMO_ERROR("INVALID PACKET FROM MAC, APP ID#%d.", hdr->app_id,2,3,4,5,6);
|
|
iot_pkt_free(pkt);
|
|
return;
|
|
}
|
|
|
|
/* Check if I'm registerd before handling msg. */
|
|
if ((!(app_demo_spd_ready & APP_DEMO_RDY_REG)) &&
|
|
(IOT_PLC_MSG_APP_REG_CONF != hdr->msg_id))
|
|
{
|
|
DEMO_ERROR("INVALID PACKET FROM MAC, MSG ID#%d, STATUS#0x%08X.",
|
|
hdr->msg_id, app_demo_spd_ready,3,4,5,6);
|
|
iot_pkt_free(pkt);
|
|
return;
|
|
}
|
|
|
|
switch (hdr->msg_id)
|
|
{
|
|
case IOT_PLC_MSG_APP_REG_CONF :
|
|
{
|
|
iot_plc_app_reg_conf_t* rpt = (iot_plc_app_reg_conf_t*)(hdr + 1);
|
|
iot_plc_cfg_set_req_t cfg;
|
|
|
|
if ((IOT_PLC_SUCCESS == rpt->result) ||
|
|
(IOT_PLC_SUCCESS_MODIFIED == rpt->result)) {
|
|
app_demo_spd_ready |= APP_DEMO_RDY_REG;
|
|
DEMO_INFO("APP REGISTERED SUCCESSFULLY.",1,2,3,4,5,6);
|
|
|
|
os_mem_set(&cfg, 0, sizeof(cfg));
|
|
cfg.addr_valid = 1;
|
|
cfg.addr_type = IOT_PLC_MAC_ADDR_TYPE_METER;
|
|
iot_mac_addr_cpy(cfg.addr, (uint8_t *)app_demo_mac_local);
|
|
cfg.dev_type_valid = 1;
|
|
|
|
#if INCLUDE_APP_DEMO_SPD_SENDER
|
|
cfg.dev_type = IOT_PLC_DEV_TYPE_CONCENTRATOR;
|
|
#else
|
|
cfg.dev_type = IOT_PLC_DEV_TYPE_METER_CONTROLLER;
|
|
#endif
|
|
cfg.reset = 1;
|
|
|
|
DEMO_INFO("SET LOCAL MAC : %02x-%02x-%02x-%02x-%02x-%02x.",
|
|
app_demo_mac_local[0], app_demo_mac_local[1],
|
|
app_demo_mac_local[2], app_demo_mac_local[3],
|
|
app_demo_mac_local[4], app_demo_mac_local[5]);
|
|
|
|
iot_plc_set_cfg
|
|
(app_demo_spd_app_handle, IOT_PLC_API_REQ_ID_DEFAULT, &cfg);
|
|
|
|
iot_plc_set_whitelist
|
|
(app_demo_spd_app_handle, IOT_PLC_API_REQ_ID_DEFAULT,
|
|
IOT_PLC_WL_ENABLE, 0, NULL);
|
|
}
|
|
|
|
break;
|
|
}
|
|
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)
|
|
{
|
|
DEMO_INFO("STATE CHANGE REPORT MAC GET READY, MY ROLE TYPE#%d.",
|
|
rpt->dev_role,2,3,4,5,6);
|
|
|
|
DEMO_INFO("CCO MAC : %02x-%02x-%02x-%02x-%02x-%02x.",
|
|
rpt->cco_mac[0], rpt->cco_mac[1], rpt->cco_mac[2],
|
|
rpt->cco_mac[3], rpt->cco_mac[4], rpt->cco_mac[5]);
|
|
|
|
DEMO_INFO("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]);
|
|
|
|
if((IOT_PLC_DEV_ROLE_STA == rpt->dev_role)
|
|
&& (!os_mem_cmp(app_demo_mac_remote, rpt->cco_mac, sizeof(app_demo_mac_remote))))
|
|
{
|
|
app_demo_spd_ready |= APP_DEMO_RDY_REMOTE;
|
|
}
|
|
app_demo_spd_ready |= APP_DEMO_RDY_LOCAL;
|
|
}
|
|
else
|
|
{
|
|
DEMO_INFO("MAC IS NOT READY.",1,2,3,4,5,6);
|
|
app_demo_spd_ready &= (~APP_DEMO_RDY_LOCAL);
|
|
app_demo_spd_ready |= APP_DEMO_RDY_RESTART;
|
|
}
|
|
break;
|
|
}
|
|
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)
|
|
{
|
|
DEMO_INFO("DEVICE INFO REPORT MAC GET READY, MY ROLE TYPE#%d.",
|
|
rpt->dev_role,2,3,4,5,6);
|
|
|
|
DEMO_INFO("CCO MAC : %02x-%02x-%02x-%02x-%02x-%02x.",
|
|
rpt->cco_mac[0], rpt->cco_mac[1], rpt->cco_mac[2],
|
|
rpt->cco_mac[3], rpt->cco_mac[4], rpt->cco_mac[5]);
|
|
|
|
DEMO_INFO("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]);
|
|
|
|
if((IOT_PLC_DEV_ROLE_STA == rpt->dev_role)
|
|
&& iot_mac_addr_cmp(app_demo_mac_remote, rpt->cco_mac))
|
|
{
|
|
app_demo_spd_ready |= APP_DEMO_RDY_REMOTE;
|
|
}
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_LOCAL;
|
|
}
|
|
else
|
|
{
|
|
DEMO_INFO("MAC IS NOT READY.",1,2,3,4,5,6);
|
|
app_demo_spd_ready &= (~APP_DEMO_RDY_LOCAL);
|
|
app_demo_spd_ready |= APP_DEMO_RDY_RESTART;
|
|
}
|
|
break;
|
|
}
|
|
case IOT_PLC_MSG_STA_JOIN_INFO :
|
|
{
|
|
iot_plc_sta_join_info_t* rpt = (iot_plc_sta_join_info_t*)(hdr + 1);
|
|
DEMO_INFO("STA JOINED : %02x-%02x-%02x-%02x-%02x-%02x.",
|
|
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_mac_addr_cmp(app_demo_mac_remote, rpt->sta_info.addr))
|
|
{
|
|
app_demo_spd_ready |= APP_DEMO_RDY_REMOTE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
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++)
|
|
{
|
|
DEMO_INFO("STA LEAVED : %02x-%02x-%02x-%02x-%02x-%02x.",
|
|
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_mac_addr_cmp(app_demo_mac_remote, rpt->sta[cnt].mac_addr))
|
|
{
|
|
app_demo_spd_ready &= ~APP_DEMO_RDY_REMOTE;
|
|
app_demo_spd_ready |= APP_DEMO_RDY_RESTART;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case IOT_PLC_MSG_NW_WL_SET_RPT:
|
|
{
|
|
if(!(APP_DEMO_RDY_WL & app_demo_spd_ready))
|
|
{
|
|
iot_plc_set_whitelist
|
|
(app_demo_spd_app_handle, IOT_PLC_API_REQ_ID_DEFAULT,
|
|
IOT_PLC_WL_ADD, 1, (uint8_t *)app_demo_mac_remote);
|
|
|
|
DEMO_INFO("SET WHITELIST : %02x-%02x-%02x-%02x-%02x-%02x.",
|
|
app_demo_mac_remote[0], app_demo_mac_remote[1],
|
|
app_demo_mac_remote[2], app_demo_mac_remote[3],
|
|
app_demo_mac_remote[4], app_demo_mac_remote[5]);
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_WL;
|
|
}
|
|
}
|
|
case IOT_PLC_MSG_MSDU_RECV:
|
|
{
|
|
iot_plc_msdu_recv_t *p_msdu = (iot_plc_msdu_recv_t*)
|
|
(iot_pkt_data(pkt) + sizeof(iot_plc_msg_header_t));
|
|
|
|
if(APP_DEMO_SPD_READY())
|
|
{
|
|
app_demo_spd_mac_data_process(p_msdu);
|
|
}
|
|
}
|
|
default :
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(pkt)
|
|
{
|
|
iot_pkt_free(pkt);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_plc_rcv(void *param, iot_pkt_t *p_pkt)
|
|
{
|
|
(void)param;
|
|
|
|
app_demo_spd_post_msg(E_DEMO_MSG_FROM_MAC, 0, (void*)p_pkt);
|
|
|
|
return;
|
|
}
|
|
|
|
/* Register an APP to PLC-layer,so we can transmit/receive packet from it. */
|
|
uint32_t app_demo_spd_app_reg(void)
|
|
{
|
|
iot_plc_app_t app;
|
|
|
|
app.app_id = IOT_PLC_APP_DEMO_ID;
|
|
app.param = NULL;
|
|
app.prio = DEMO_PLC_CMD_PRIO;
|
|
app.recv = app_demo_spd_plc_rcv;
|
|
|
|
app_demo_spd_app_handle = iot_plc_register_app(&app);
|
|
|
|
if(NULL == app_demo_spd_app_handle)
|
|
{
|
|
DEMO_ERROR("REGISTER APP FAILED !!", 1, 2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
return ERR_OK;
|
|
}
|
|
|
|
void app_demo_spd_light_status_idle(void)
|
|
{
|
|
static uint32_t status = 0;
|
|
|
|
iot_gpio_value_set(app_demo_spd_led_green, status);
|
|
iot_gpio_value_set(app_demo_spd_led_red, status);
|
|
|
|
status = status ? 0 : 1;
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_light_status_test(void)
|
|
{
|
|
static uint32_t status = 0;
|
|
|
|
if(status)
|
|
{
|
|
iot_gpio_value_set(app_demo_spd_led_green, 0);
|
|
iot_gpio_value_set(app_demo_spd_led_red, 1);
|
|
|
|
status = 0;
|
|
}
|
|
else
|
|
{
|
|
iot_gpio_value_set(app_demo_spd_led_green, 1);
|
|
iot_gpio_value_set(app_demo_spd_led_red, 0);
|
|
|
|
status = 1;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_light_status_report(void)
|
|
{
|
|
uint32_t green, red, mask;
|
|
|
|
if(g_app_demo_spd_lght_words.pos >= g_app_demo_spd_lght_words.steps)
|
|
{
|
|
g_app_demo_spd_lght_words.pos = 0;
|
|
}
|
|
|
|
if(g_app_demo_spd_lght_words.pos > 31)
|
|
{
|
|
mask = 1 << ( 63 - g_app_demo_spd_lght_words.pos);
|
|
green = g_app_demo_spd_lght_words.green[1];
|
|
red = g_app_demo_spd_lght_words.red[1];
|
|
}
|
|
else
|
|
{
|
|
mask = 1 << ( 31 - g_app_demo_spd_lght_words.pos);
|
|
green = g_app_demo_spd_lght_words.green[0];
|
|
red = g_app_demo_spd_lght_words.red[0];
|
|
}
|
|
|
|
if(mask & green)
|
|
{
|
|
iot_gpio_value_set(app_demo_spd_led_green, 0);
|
|
}
|
|
else
|
|
{
|
|
iot_gpio_value_set(app_demo_spd_led_green, 1);
|
|
}
|
|
|
|
if(mask & red)
|
|
{
|
|
iot_gpio_value_set(app_demo_spd_led_red, 0);
|
|
}
|
|
else
|
|
{
|
|
iot_gpio_value_set(app_demo_spd_led_red, 1);
|
|
}
|
|
|
|
g_app_demo_spd_lght_words.pos++;
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_led_tmr_process(void)
|
|
{
|
|
#if INCLUDE_APP_DEMO_SPD_SENDER
|
|
if(APP_DEMO_SPD_RESTART())
|
|
{
|
|
app_demo_spd_restart();
|
|
}
|
|
#endif
|
|
if((APP_DEMO_RDY_TEST | APP_DEMO_RDY_S_REPORT) & app_demo_spd_ready)
|
|
{
|
|
app_demo_spd_light_status_test();
|
|
}
|
|
else if(APP_DEMO_RDY_FINISH & app_demo_spd_ready)
|
|
{
|
|
app_demo_spd_light_status_report();
|
|
}
|
|
else
|
|
{
|
|
app_demo_spd_light_status_idle();
|
|
}
|
|
}
|
|
|
|
void app_demo_spd_task_event_handle(iot_task_h task_h, uint32_t event)
|
|
{
|
|
(void)task_h;
|
|
|
|
if(APP_DEMO_SPD_EVT_TRSVD_TMR == event)
|
|
{
|
|
app_demo_spd_trcvd_tmr_process();
|
|
}
|
|
else
|
|
{
|
|
app_demo_spd_led_tmr_process();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_tmr_handle(timer_id_t tid, void *data)
|
|
{
|
|
(void)tid;
|
|
|
|
os_set_task_event_with_v
|
|
(iot_task_get_os_task_h(app_demo_spd_task_handle), (uint32_t)data);
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_task_msg_handle(iot_task_h task_h, iot_task_msg_t *msg)
|
|
{
|
|
demo_spd_msg_t *dm_msg = (demo_spd_msg_t *)msg;
|
|
|
|
(void)task_h;
|
|
|
|
if((NULL == dm_msg)
|
|
||(!DEMO_MSG_VALID(dm_msg->msg.type)))
|
|
{
|
|
/* Maybe this can cause memory overflow! */
|
|
DEMO_ERROR("HANDLE AN INVALID MSG !!", 1,2,3,4,5,6);
|
|
return;
|
|
}
|
|
|
|
if(E_DEMO_MSG_FROM_MAC == dm_msg->msg.type)
|
|
{
|
|
app_demo_spd_mac_status_process((iot_pkt_t *)dm_msg->data);
|
|
}
|
|
|
|
iot_task_free_msg(task_h, &(dm_msg->msg));
|
|
|
|
return;
|
|
}
|
|
|
|
void app_demo_spd_task_msg_cancel(iot_task_h task_h, iot_task_msg_t *msg)
|
|
{
|
|
(void)task_h;
|
|
(void)msg;
|
|
}
|
|
|
|
uint32_t app_demo_spd_module_init(void)
|
|
{
|
|
iot_task_config_t t_cfg;
|
|
|
|
#if INCLUDE_APP_DEMO_SPD_SENDER
|
|
uint32_t intval_inx, speed_inx, cast_inx;
|
|
spd_info_t *p_spd_info;
|
|
#endif
|
|
|
|
t_cfg.stack_size = 0;
|
|
t_cfg.task_prio = DEMO_MSG_HANDLE_TASK_PRIO;
|
|
t_cfg.msg_size = sizeof(demo_spd_msg_t);
|
|
t_cfg.msg_cnt = DEMO_MSG_PENDING_LIMIT;
|
|
t_cfg.queue_cnt = DEMO_MSG_TASK_PRIO_QUE;
|
|
t_cfg.queue_cfg[0].quota = 0;
|
|
t_cfg.task_event_func = app_demo_spd_task_event_handle;
|
|
t_cfg.msg_exe_func = app_demo_spd_task_msg_handle;
|
|
t_cfg.msg_cancel_func = app_demo_spd_task_msg_cancel;
|
|
|
|
app_demo_spd_task_handle = iot_task_create(IOT_APP_DEMO_MID, &t_cfg);
|
|
|
|
if(NULL == app_demo_spd_task_handle)
|
|
{
|
|
DEMO_ERROR("iot_task_create RETURNS NULL !!", 1,2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
#if INCLUDE_APP_DEMO_SPD_SENDER
|
|
|
|
os_mem_set(g_app_demo_spd_test_items, 0x0, sizeof(g_app_demo_spd_test_items));
|
|
for(cast_inx = 0; cast_inx < APP_DEMO_SPD_CAST_NUM; cast_inx++)
|
|
{
|
|
for(speed_inx = 0; speed_inx < APP_DEMO_SPD_SPEED_NUM; speed_inx++)
|
|
{
|
|
for(intval_inx = 0; intval_inx < APP_DEMO_SPD_INTVL_NUM; intval_inx++)
|
|
{
|
|
p_spd_info = &g_app_demo_spd_test_items[cast_inx][speed_inx][intval_inx];
|
|
p_spd_info->is_bcast = cast_inx ? 1 : 0;
|
|
p_spd_info->speed = g_demo_spd_speed[speed_inx];
|
|
p_spd_info->interval = g_demo_spd_interval[intval_inx];
|
|
|
|
p_spd_info->pkt_size = (p_spd_info->speed * p_spd_info->interval) / 8;
|
|
}
|
|
}
|
|
}
|
|
|
|
g_app_demo_spd_remain_pkts = APP_DEMO_SPD_TEST_PACKET_NUM;
|
|
|
|
#endif
|
|
|
|
app_demo_spd_ready = APP_DEMO_RDY_RESTART | APP_DEMO_RDY_IDLE;
|
|
|
|
app_demo_spd_led_red = iot_board_get_gpio(GPIO_TX_LED);
|
|
app_demo_spd_led_green = iot_board_get_gpio(GPIO_RX_LED);
|
|
|
|
if((ERR_OK != iot_gpio_open_as_output(app_demo_spd_led_red))
|
|
||(ERR_OK != iot_gpio_set_pull_mode(app_demo_spd_led_red, GPIO_PULL_UP)))
|
|
{
|
|
DEMO_ERROR("OPEN GPIO#%d FAILED !!", app_demo_spd_led_red, 2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
if((ERR_OK != iot_gpio_open_as_output(app_demo_spd_led_green))
|
|
||(ERR_OK != iot_gpio_set_pull_mode(app_demo_spd_led_green, GPIO_PULL_UP)))
|
|
{
|
|
DEMO_ERROR("OPEN GPIO#%d FAILED !!", app_demo_spd_led_green, 2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
if((timer_id_t)NULL == (app_demo_spd_led_tmr = os_create_timer
|
|
(IOT_APP_DEMO_MID, 1, (os_timer_func_t)app_demo_spd_tmr_handle,
|
|
(void *)APP_DEMO_SPD_EVT_LED_TMR)))
|
|
{
|
|
DEMO_ERROR("CREATE LED TMR FAILED !!", 1, 2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
if((timer_id_t)NULL == (app_demo_spd_trcvd_tmr = os_create_timer
|
|
(IOT_APP_DEMO_MID, 1, (os_timer_func_t)app_demo_spd_tmr_handle,
|
|
(void *)APP_DEMO_SPD_EVT_TRSVD_TMR)))
|
|
{
|
|
DEMO_ERROR("CREATE TRANSEICE TMR FAILED !!", 1, 2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
if(ERR_OK != app_demo_spd_app_reg())
|
|
{
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
if (iot_plc_is_client_mode()) {
|
|
/* default set sta only scan band 1, freq: 2.4M to 5.6M */
|
|
app_demo_set_sta_scan_band(PLC_LIB_FREQ_BAND_1);
|
|
|
|
/* close watchdog */
|
|
iot_plc_wdg_set(app_demo_spd_app_handle, 0, 0);
|
|
}
|
|
|
|
DEMO_INFO(" SET BAND ID...", 1,2,3,4,5,6);
|
|
if(ERR_OK != app_demo_set_band(PLC_LIB_FREQ_BAND_1))
|
|
{
|
|
DEMO_ERROR("SET BAND ID FAILED !!", 1,2,3,4,5,6);
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
app_demo_spd_ready |= APP_DEMO_RDY_IDLE;
|
|
|
|
os_start_timer(app_demo_spd_led_tmr, APP_DEMO_SPD_TMR_INTVAL);
|
|
|
|
DEMO_INFO("SPEED TEST INIT DONE.",1,2,3,4,5,6);
|
|
|
|
return ERR_OK;
|
|
|
|
}
|
|
#endif
|