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
 |