692 lines
20 KiB
C
692 lines
20 KiB
C
|
/****************************************************************************
|
||
|
|
||
|
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.
|
||
|
|
||
|
****************************************************************************/
|
||
|
/* os_ship header files */
|
||
|
#include "os_task_api.h"
|
||
|
#include "os_event_api.h"
|
||
|
#include "os_timer_api.h"
|
||
|
#include "os_utils_api.h"
|
||
|
|
||
|
/* iot common header files */
|
||
|
#include "iot_plc_cco_api.h"
|
||
|
#include "iot_module_api.h"
|
||
|
#include "iot_queue_api.h"
|
||
|
#include "iot_mem_pool_api.h"
|
||
|
#include "iot_config_api.h"
|
||
|
#include "iot_app_api.h"
|
||
|
#include "iot_errno_api.h"
|
||
|
#include "iot_io_api.h"
|
||
|
#include "iot_dbglog_api.h"
|
||
|
#include "iot_uart_api.h"
|
||
|
#include "iot_task_api.h"
|
||
|
#include "iot_oem_api.h"
|
||
|
#include "iot_board_api.h"
|
||
|
|
||
|
#include "iot_grapp.h"
|
||
|
#include "iot_plctxrx.h"
|
||
|
#include "iot_proto_common.h"
|
||
|
#include "iot_gr_upgrade.h"
|
||
|
#include "iot_plc_led_api.h"
|
||
|
|
||
|
#if (IOT_LWIP_SUPPORT)
|
||
|
#include "ge_socket_server.h"
|
||
|
#include "ge_socket_client.h"
|
||
|
#include "lwmqtt_main.h"
|
||
|
#endif
|
||
|
|
||
|
#if (IOT_LED_CTRL_APP_ENABLE)
|
||
|
#include "iot_light_ctrl_drv.h"
|
||
|
#endif
|
||
|
|
||
|
#if IOT_GR_APP_ENABLE
|
||
|
|
||
|
#if (IOT_LWIP_SUPPORT && HW_PLATFORM != HW_PLATFORM_SIMU)
|
||
|
extern void iot_lwip_init();
|
||
|
#else
|
||
|
#define iot_lwip_init()
|
||
|
#define gs_server_init()
|
||
|
#define gs_server_register_recv(recv) 0
|
||
|
#define gs_server_send(ptr, length) 0
|
||
|
#define lwmqtt_lwip_init()
|
||
|
#define lwmqtt_message_received_from_ge(p_pkt_frame) 0
|
||
|
#endif
|
||
|
|
||
|
extern void iot_print_config(bool_t enable);
|
||
|
|
||
|
extern void iot_cus_print_config(bool_t enable);
|
||
|
|
||
|
static void iot_grapp_uart_meter_port_func(uint8_t* buffer,
|
||
|
uint32_t buffer_len, bool_t is_full_frame,uint32_t invalid_data_len);
|
||
|
|
||
|
static char grapp_log_buf[IOT_GRAPP_LOG_BUF_LEN] = { 0 };
|
||
|
|
||
|
/* global gree app variable */
|
||
|
greeplc_app_t *greeapp = NULL;
|
||
|
/* uart configure */
|
||
|
static grapp_uart_cfg_t gbl_grapp_uart_cfg =
|
||
|
{
|
||
|
0, // port
|
||
|
IOT_UART_BANDRATE_DEFAULT, // baud
|
||
|
DEF_UART_PARITY, // parity
|
||
|
IOT_UART_DLEN_8_BITS, // data
|
||
|
IOT_UART_STOP_1_BITS, // stop
|
||
|
iot_grapp_uart_meter_port_func, // pointer of callback when recv data
|
||
|
UART_RECV_SIZE_MAX // buffer size
|
||
|
};
|
||
|
|
||
|
void iot_grapp_data_print(const char* str, uint8_t* buf, uint32_t len)
|
||
|
{
|
||
|
uint32_t offset = 0;
|
||
|
offset = iot_sprintf(grapp_log_buf, "%s[len:%d]", str, len);
|
||
|
for (uint32_t i = 0; i < len; ++i) {
|
||
|
offset += iot_sprintf(grapp_log_buf + offset, "%02X ", buf[i]);
|
||
|
if (IOT_GRAPP_LOG_BUF_LEN <= offset + 4) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
grapp_log_buf[offset] = 0;
|
||
|
iot_cus_printf("%s\n", grapp_log_buf);
|
||
|
}
|
||
|
|
||
|
void iot_grapp_modify_uart_param(uint8_t baud_idx, uint8_t parity,
|
||
|
uint8_t data_bit, uint8_t stop_bit)
|
||
|
{
|
||
|
uint32_t uart_baud_rate[] = PROTO_GE_UART_BAUD_VALUE;
|
||
|
|
||
|
if (baud_idx >= PROTO_GE_UART_BAUD_IDX_MAX) {
|
||
|
baud_idx = 0;
|
||
|
}
|
||
|
if (iot_proto_uart_param_check(uart_baud_rate[baud_idx], parity, data_bit,
|
||
|
stop_bit) == true) {
|
||
|
gbl_grapp_uart_cfg.baud = uart_baud_rate[baud_idx];
|
||
|
gbl_grapp_uart_cfg.parity = parity;
|
||
|
gbl_grapp_uart_cfg.data = data_bit;
|
||
|
gbl_grapp_uart_cfg.stop = stop_bit;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static iot_uart_h iot_grapp_open_uart(void)
|
||
|
{
|
||
|
iot_uart_h uart = 0;
|
||
|
grapp_uart_cfg_t* uart_cfg = &gbl_grapp_uart_cfg;
|
||
|
|
||
|
uart_cfg->port = iot_board_get_uart(UART_CUS_PORT_0);
|
||
|
|
||
|
if (uart_cfg->port >= iot_uart_get_max_port_num()) {
|
||
|
iot_cus_printf("[ERR] %s Invalid UART#%d !!", __FUNCTION__,
|
||
|
uart_cfg->port);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
uart = iot_uart_open(uart_cfg->port,uart_cfg->rec_ptr,
|
||
|
uart_cfg->recbuf_sz, NULL);
|
||
|
return uart;
|
||
|
}
|
||
|
|
||
|
static void iot_grapp_close_uart(void)
|
||
|
{
|
||
|
iot_uart_close(greeapp->uart_com);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bool_t iot_grapp_set_uart(iot_uart_h uart, grapp_uart_cfg_t *cfg)
|
||
|
{
|
||
|
bool_t ret = false;
|
||
|
grapp_uart_cfg_t* uart_cfg = cfg;
|
||
|
|
||
|
iot_cus_printf("set uart:%d [%d, %d, %d, %d]\n", uart_cfg->port,
|
||
|
uart_cfg->baud, uart_cfg->parity, uart_cfg->data, uart_cfg->stop);
|
||
|
ret = iot_uart_set_config(uart, uart_cfg->baud, uart_cfg->parity,
|
||
|
uart_cfg->data, uart_cfg->stop);
|
||
|
|
||
|
iot_uart_set_threshold(uart, UART_THR_RXTIMEOUT,
|
||
|
IOT_UART_DEFAULT_THDVALUE);
|
||
|
iot_uart_set_threshold(uart, UART_THR_NO_FMT_TIMEOUT,
|
||
|
IOT_UART_DEFAULT_THDVALUE);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
bool_t iot_grapp_set_uart_config(iot_uart_h uart)
|
||
|
{
|
||
|
return iot_grapp_set_uart(uart, &gbl_grapp_uart_cfg);
|
||
|
}
|
||
|
|
||
|
/* uart recv callback function for uart task receiving data from uart 0 */
|
||
|
static void iot_grapp_uart_meter_port_func(uint8_t* buffer,
|
||
|
uint32_t buffer_len, bool_t is_full_frame,uint32_t invalid_data_len)
|
||
|
{
|
||
|
(void)invalid_data_len;
|
||
|
(void)is_full_frame ;
|
||
|
|
||
|
if(0 == buffer_len){
|
||
|
return ;
|
||
|
}
|
||
|
iot_plc_led_request(IOT_PLC_LED_REQ_PLC_485_RX);
|
||
|
iot_grapp_data_print("uart recv", buffer, buffer_len);
|
||
|
/* distinguish AT or MCU mode */
|
||
|
if (GR_MCU_OP_MODE == greeapp->uart_mode) {
|
||
|
if (greeapp->uart_dispatch_fntable[GR_MCU_OP_MODE]) {
|
||
|
greeapp->uart_dispatch_fntable[GR_MCU_OP_MODE](buffer,
|
||
|
(uint16_t)buffer_len);
|
||
|
}
|
||
|
} else if (GR_AT_OP_MODE == greeapp->uart_mode) {
|
||
|
if (greeapp->uart_dispatch_fntable[GR_AT_OP_MODE]) {
|
||
|
greeapp->uart_dispatch_fntable[GR_AT_OP_MODE](buffer,
|
||
|
(uint16_t)buffer_len);
|
||
|
}
|
||
|
} else if (GR_DEV_TEST_OP_MODE == greeapp->uart_mode) {
|
||
|
if (greeapp->uart_dispatch_fntable[GR_DEV_TEST_OP_MODE]) {
|
||
|
greeapp->uart_dispatch_fntable[GR_DEV_TEST_OP_MODE](buffer,
|
||
|
(uint16_t)buffer_len);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uint32_t iot_grapp_sendto_mainboard_fn(iot_pkt_t *data)
|
||
|
{
|
||
|
uint8_t ret = ERR_FAIL;
|
||
|
|
||
|
if (iot_hwver_is_ledc_v3_0_jy() &&
|
||
|
(iot_board_get_board_id() == CUS_BOARD_ID_LEDC_V3_0) &&
|
||
|
(IOT_PLC_DEV_ROLE_STA == prototask_contxt.local_dev.nw_role)) {
|
||
|
if (greeapp->uart_com == NULL) {
|
||
|
iot_proto_mainboard_data_pend(data);
|
||
|
proto_post_data_to_edge_msg_handle(EDGE_INPUT_REQ_STOPID_ID,
|
||
|
NULL, 0);
|
||
|
goto out;
|
||
|
}
|
||
|
iot_edge_delay_start();
|
||
|
}
|
||
|
iot_plc_led_request(IOT_PLC_LED_REQ_PLC_485_TX);
|
||
|
ret = iot_uart_send(greeapp->uart_com, data, NULL);
|
||
|
|
||
|
out:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#if (SUPPORT_HOST_PORT_ETH)
|
||
|
/* eth recv callback function for eth task receiving data from eth */
|
||
|
int8_t iot_grapp_eth_meter_port_func(int8_t *buffer, uint16_t buffer_len)
|
||
|
{
|
||
|
if ((NULL == buffer) || (0 == buffer_len)) {
|
||
|
return ERR_INVAL;
|
||
|
}
|
||
|
|
||
|
iot_grapp_data_print("eth recv", (uint8_t *)buffer, buffer_len);
|
||
|
/* distinguish AT or MCU mode */
|
||
|
if (GR_MCU_OP_MODE == greeapp->uart_mode) {
|
||
|
if (greeapp->eth_dispatch_fntable[GR_MCU_OP_MODE]) {
|
||
|
greeapp->eth_dispatch_fntable[GR_MCU_OP_MODE]((uint8_t *)buffer,
|
||
|
buffer_len);
|
||
|
}
|
||
|
} else if (GR_AT_OP_MODE == greeapp->uart_mode) {
|
||
|
if (greeapp->eth_dispatch_fntable[GR_AT_OP_MODE]) {
|
||
|
greeapp->eth_dispatch_fntable[GR_AT_OP_MODE]((uint8_t *)buffer,
|
||
|
buffer_len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
|
||
|
uint32_t iot_grapp_sendto_mainboard_eth_fn(iot_pkt_t *data)
|
||
|
{
|
||
|
if (NULL == data) {
|
||
|
return ERR_INVAL;
|
||
|
}
|
||
|
|
||
|
int32_t ret = -1;
|
||
|
if ((ret = gs_server_send((void *)iot_pkt_data(data),
|
||
|
(uint16_t)iot_pkt_data_len(data))) <= 0) {
|
||
|
return ERR_FAIL;
|
||
|
} else {
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
int8_t iot_grapp_eth_meter_port_func(int8_t *buffer, uint16_t buffer_len)
|
||
|
{
|
||
|
(void)buffer;
|
||
|
(void)buffer_len;
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
uint32_t iot_grapp_sendto_mainboard_eth_fn(iot_pkt_t *data)
|
||
|
{
|
||
|
(void)data;
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
#endif /* end SUPPORT_HOST_PORT_ETH */
|
||
|
|
||
|
/* get uart mode info from oem base config */
|
||
|
#if (IOT_PSRAM_ENABLE)
|
||
|
uint8_t iot_get_oem_uart_mode(void)
|
||
|
{
|
||
|
iot_oem_base_cfg_t *oem_base_cfg;
|
||
|
iot_oem_get_base_cfg(&oem_base_cfg);
|
||
|
|
||
|
iot_cus_printf("[grapp]get iotapp_mode=%d\n", oem_base_cfg->iotapp_mode);
|
||
|
|
||
|
if (oem_base_cfg->iotapp_mode >= GR_MCU_OP_MODE &&
|
||
|
oem_base_cfg->iotapp_mode <= GR_AT_OP_MODE) {
|
||
|
return oem_base_cfg->iotapp_mode;
|
||
|
} else {
|
||
|
return GR_MCU_OP_MODE;
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
uint8_t iot_get_oem_uart_mode(void)
|
||
|
{
|
||
|
#if INCLUDE_AT_COMMAND_MODULE
|
||
|
return GR_AT_OP_MODE;
|
||
|
#else
|
||
|
return GR_MCU_OP_MODE;
|
||
|
#endif
|
||
|
}
|
||
|
#endif /*end IOT_PSRAM_ENABLE */
|
||
|
|
||
|
/* get host port info from oem base config */
|
||
|
uint8_t iot_get_oem_host_port(void)
|
||
|
{
|
||
|
#if (SUPPORT_HOST_PORT_ETH)
|
||
|
iot_oem_base_cfg_t *oem_base_cfg;
|
||
|
iot_oem_get_base_cfg(&oem_base_cfg);
|
||
|
|
||
|
iot_cus_printf("[grapp]get host_port=%d\n", oem_base_cfg->host_port);
|
||
|
if (oem_base_cfg->host_port >= HOST_PORT_UART &&
|
||
|
oem_base_cfg->host_port <= HOST_PORT_ETH) {
|
||
|
return oem_base_cfg->host_port;
|
||
|
} else {
|
||
|
return HOST_PORT_UART;
|
||
|
}
|
||
|
#else
|
||
|
return HOST_PORT_UART;
|
||
|
#endif /* end SUPPORT_HOST_PORT_ETH */
|
||
|
}
|
||
|
|
||
|
#if (IOT_GE_INCLUDE_LWMQTT)
|
||
|
uint32_t iot_grapp_lwmqtt_message_from_ge(iot_pkt_t *p_pkt)
|
||
|
{
|
||
|
if (NULL == p_pkt) {
|
||
|
return ERR_FAIL;
|
||
|
}
|
||
|
|
||
|
return lwmqtt_message_received_from_ge(p_pkt);
|
||
|
}
|
||
|
|
||
|
uint8_t iot_grapp_lwmqtt_message_to_ge(uint8_t *mq_str, uint16_t str_len)
|
||
|
{
|
||
|
/* TODO : GE only for now, AT not implamented. */
|
||
|
if (greeapp->mqtt_dispatch_fntable[GR_MCU_OP_MODE]) {
|
||
|
greeapp->mqtt_dispatch_fntable[GR_MCU_OP_MODE](mq_str, str_len);
|
||
|
}
|
||
|
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
#endif /* end IOT_GE_INCLUDE_LWMQTT */
|
||
|
|
||
|
#if IOT_GE_EXT_SDK_ENABLE
|
||
|
uint8_t iot_cus_task_message_to_ge(uint8_t *mq_str, uint16_t str_len) {
|
||
|
/* TODO : GE only for now, AT not implamented. */
|
||
|
if (greeapp->app_dispatch_fntable[GR_MCU_OP_MODE]) {
|
||
|
greeapp->app_dispatch_fntable[GR_MCU_OP_MODE](mq_str, str_len);
|
||
|
}
|
||
|
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
|
||
|
bool_t iot_grapp_init_success()
|
||
|
{
|
||
|
if (NULL == greeapp) {
|
||
|
return false;
|
||
|
} else {
|
||
|
return greeapp->grapp_init_success;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if (IOT_LED_CTRL_APP_ENABLE && PLC_SUPPORT_STA_ROLE)
|
||
|
|
||
|
#if HW_PLATFORM != HW_PLATFORM_SIMU
|
||
|
uint32_t iot_grapp_ledc_app_message_from_ge(iot_pkt_t * p_pkt) {
|
||
|
|
||
|
if (NULL == p_pkt) {
|
||
|
return ERR_FAIL;
|
||
|
}
|
||
|
|
||
|
return lwmqtt_message_received_from_ge(p_pkt);
|
||
|
}
|
||
|
|
||
|
uint8_t iot_grapp_ledc_app_message_to_ge(uint8_t *mq_str, uint16_t str_len) {
|
||
|
/* TODO : GE only for now, AT not implamented. */
|
||
|
if (greeapp->app_dispatch_fntable[GR_MCU_OP_MODE]) {
|
||
|
greeapp->app_dispatch_fntable[GR_MCU_OP_MODE](mq_str, str_len);
|
||
|
}
|
||
|
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
#else
|
||
|
|
||
|
#define iot_grapp_ledc_app_message_to_ge(mq_str, len) 0
|
||
|
|
||
|
uint32_t iot_grapp_ledc_app_message_from_ge(iot_pkt_t * p_pkt)
|
||
|
{
|
||
|
(void)p_pkt;
|
||
|
return ERR_OK;
|
||
|
}
|
||
|
|
||
|
#endif /* end HW_PLATFORM != HW_PLATFORM_SIMU */
|
||
|
#endif /* end (IOT_LED_CTRL_APP_ENABLE && PLC_SUPPORT_STA_ROLE) */
|
||
|
|
||
|
static uint32_t iot_gr_app_init(void)
|
||
|
{
|
||
|
uint32_t ret = ERR_OK;
|
||
|
iot_plc_app_t app;
|
||
|
|
||
|
app.app_id = IOT_GR_APP_ID;
|
||
|
app.param = NULL;
|
||
|
app.prio = APP_GR_PRIORITY;
|
||
|
/* msg from cvg layer callback */
|
||
|
app.recv = iot_plctxrx_msdu_from_cvg;
|
||
|
|
||
|
/* alloc memory first. */
|
||
|
greeapp = os_mem_malloc(IOT_GREE_APP_MID, sizeof(*greeapp));
|
||
|
|
||
|
if (!greeapp) {
|
||
|
ret = ERR_NOMEM;
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
os_mem_set(greeapp, 0x0, sizeof(*greeapp));
|
||
|
|
||
|
#if (IOT_LED_CTRL_APP_ENABLE) // LEDC APP
|
||
|
/* Fix opcode */
|
||
|
greeapp->uart_mode = GR_MCU_OP_MODE;
|
||
|
#if PLC_SUPPORT_CCO_ROLE
|
||
|
/* TODO : CCO need CUSTOM_TASK yet. */
|
||
|
greeapp->host_port = HOST_PORT_UART;
|
||
|
#else
|
||
|
greeapp->host_port = HOST_PORT_CUSTOM_TASK;
|
||
|
#endif
|
||
|
|
||
|
#else
|
||
|
#if IOT_GE_EXT_SDK_ENABLE || IOT_MICRO_CCTT_TASK_ENABLE
|
||
|
/* get uart mode from oem info */
|
||
|
greeapp->uart_mode = GR_MCU_OP_MODE;
|
||
|
/* get host port info */
|
||
|
greeapp->host_port = HOST_PORT_CUSTOM_TASK;
|
||
|
#elif IOT_GE_CKQ_MODE_ENABLE
|
||
|
/* init uart mode info */
|
||
|
greeapp->uart_mode = GR_DEV_TEST_OP_MODE;
|
||
|
/* init host port info */
|
||
|
greeapp->host_port = HOST_PORT_UART;
|
||
|
#else
|
||
|
/* get uart mode from oem info */
|
||
|
greeapp->uart_mode = iot_get_oem_uart_mode();
|
||
|
greeapp->host_port = iot_get_oem_host_port();
|
||
|
#endif
|
||
|
#endif /* end IOT_LED_CTRL_APP_ENABLE */
|
||
|
|
||
|
/* 1.initialize proto layer thread */
|
||
|
if (greeapp->uart_mode == GR_MCU_OP_MODE) {
|
||
|
ret = iot_proto_task_init();
|
||
|
}
|
||
|
|
||
|
if (ret)
|
||
|
goto error_0;
|
||
|
|
||
|
/* 2.initialize plctxrx layer thread */
|
||
|
ret = iot_plctxrx_task_init();
|
||
|
if (ret)
|
||
|
goto error_1;
|
||
|
|
||
|
#if INCLUDE_AT_COMMAND_MODULE
|
||
|
/* 3.initialize at layer thread */
|
||
|
if (greeapp->uart_mode == GR_AT_OP_MODE) {
|
||
|
greeapp->at_task = iot_at_task_init();
|
||
|
if (NULL == greeapp->at_task) {
|
||
|
goto error_2;
|
||
|
}
|
||
|
greeapp->at_context = iot_at_context_get();
|
||
|
}
|
||
|
#endif
|
||
|
#if IOT_GE_CKQ_MODE_ENABLE
|
||
|
/* 4.initialize dev test layer thread */
|
||
|
greeapp->dev_test_task = iot_dev_test_task_init();
|
||
|
if (NULL == greeapp->dev_test_task) {
|
||
|
goto error_3;
|
||
|
}
|
||
|
greeapp->devtest_context = iot_dev_test_context_get();
|
||
|
#endif
|
||
|
/* register callback function each other
|
||
|
iot_proto_plc_data_recv_func -- receive data from txrx layer
|
||
|
iot_proto_plctxrx_cmd_resp_recv_func --receive cmdrsp/ind from txrx layer
|
||
|
iot_proto_update_passwd update local passwd to proto layer
|
||
|
*/
|
||
|
iot_plctxrx_proto_register(iot_proto_plc_data_recv_func,
|
||
|
iot_proto_plctxrx_cmd_resp_recv_func, iot_proto_update_vendr);
|
||
|
|
||
|
/* plctxrx_cmd_send_mssage -- send txrx cmd api for proto layer.
|
||
|
gree_send_cbk send txrx data -- send txrx data api for proto layer
|
||
|
*/
|
||
|
iot_proto_plctxrx_register(plctxrx_cmd_send_mssage,
|
||
|
iot_plctxrx_proto_data_send_cbk);
|
||
|
|
||
|
#if INCLUDE_AT_COMMAND_MODULE
|
||
|
/* plctxrx provided function. registed to at. */
|
||
|
iot_at_command_fn_register_send_to_plc(plctxrx_cmd_send_mssage);
|
||
|
#endif
|
||
|
|
||
|
/* at provided function, registed to plctxrx. receive command response */
|
||
|
iot_plctxrx_at_register(iot_at_command_plc_send_response_to_at);
|
||
|
|
||
|
#if IOT_GE_CKQ_MODE_ENABLE
|
||
|
/* plctxrx provided function. registed to dev test. */
|
||
|
iot_dev_test_fn_register_send_to_plc(plctxrx_cmd_send_mssage,
|
||
|
iot_plctxrx_proto_data_send_cbk);
|
||
|
|
||
|
/* dev test provided function, registed to plctxrx.
|
||
|
iot_dev_test_plc_data_recv_func -- receive data from txrx layer
|
||
|
iot_dev_test_plctxrx_cmd_resp_func -- receive cmdrsp/ind from txrx layer
|
||
|
*/
|
||
|
iot_plctxrx_dev_test_register(iot_dev_test_plc_data_recv_func,
|
||
|
iot_dev_test_plctxrx_cmd_resp_func);
|
||
|
#endif
|
||
|
|
||
|
/* distinguish UART or ETH host port */
|
||
|
if (greeapp->host_port == HOST_PORT_UART) {
|
||
|
/* hook api for put strings to communicate uart port (COM0) */
|
||
|
iot_grapp_reg_fn_receive_from_ge(HOST_PORT_UART,
|
||
|
iot_grapp_sendto_mainboard_fn);
|
||
|
|
||
|
#if INCLUDE_AT_COMMAND_MODULE
|
||
|
iot_at_command_fn_register_response_to_uart(
|
||
|
iot_grapp_sendto_mainboard_fn);
|
||
|
#endif
|
||
|
|
||
|
#if IOT_GE_CKQ_MODE_ENABLE
|
||
|
iot_dev_test_fn_register_send_to_uart(iot_grapp_sendto_mainboard_fn);
|
||
|
#endif
|
||
|
|
||
|
/* open and config uart */
|
||
|
greeapp->uart_com = iot_grapp_open_uart();
|
||
|
if (!greeapp->uart_com) {
|
||
|
iot_cus_printf("[grapp][err]uart open fail.\n");
|
||
|
ret = ERR_FAIL;
|
||
|
goto error_4;
|
||
|
} else {
|
||
|
/* set rs485 mode for JY ledc3.0 */
|
||
|
if ((CUS_BOARD_ID_LEDC_V3_0 == iot_board_get_board_id()) &&
|
||
|
iot_hwver_is_ledc_v3_0_jy()) {
|
||
|
iot_uart_enable_rs485(greeapp->uart_com,
|
||
|
iot_board_get_gpio(GPIO_RS485_TXE));
|
||
|
iot_cus_printf("set rs485 mode\n");
|
||
|
}
|
||
|
iot_cus_printf("[grapp]uart open OK.\n");
|
||
|
}
|
||
|
|
||
|
if (iot_grapp_set_uart_config(greeapp->uart_com)) {
|
||
|
iot_cus_printf("[grapp]uart config OK.\n");
|
||
|
} else {
|
||
|
iot_cus_printf("[grapp][err]uart config fail.\n");
|
||
|
ret = ERR_FAIL;
|
||
|
goto error_5;
|
||
|
}
|
||
|
|
||
|
/* register callback function offered
|
||
|
* by proto layer for uart data recv
|
||
|
*/
|
||
|
greeapp->uart_dispatch_fntable[GR_MCU_OP_MODE] = \
|
||
|
iot_grapp_get_fn_send_to_ge(HOST_PORT_UART);
|
||
|
|
||
|
/* register callback function offered
|
||
|
* by proto layer for uart data recv
|
||
|
*/
|
||
|
greeapp->uart_dispatch_fntable[GR_AT_OP_MODE] = \
|
||
|
iot_at_command_proto_send_to_at;
|
||
|
|
||
|
#if IOT_GE_CKQ_MODE_ENABLE
|
||
|
/* register callback function offered
|
||
|
* by dev test for uart data recv
|
||
|
*/
|
||
|
greeapp->uart_dispatch_fntable[GR_DEV_TEST_OP_MODE] = \
|
||
|
iot_dev_test_uart_meter_port_func;
|
||
|
#endif
|
||
|
} else if (greeapp->host_port == HOST_PORT_ETH) {
|
||
|
/* init tcpip stack */
|
||
|
iot_lwip_init();
|
||
|
/* open and config eth */
|
||
|
gs_server_init();
|
||
|
/* hook api for put strings to communicate eth */
|
||
|
iot_grapp_reg_fn_receive_from_ge(HOST_PORT_ETH,
|
||
|
iot_grapp_sendto_mainboard_eth_fn);
|
||
|
#if INCLUDE_AT_COMMAND_MODULE
|
||
|
iot_at_command_fn_register_response_to_uart(
|
||
|
iot_grapp_sendto_mainboard_eth_fn);
|
||
|
#endif
|
||
|
/*
|
||
|
* register eth recv callback function for eth task receiving
|
||
|
* data from eth
|
||
|
*/
|
||
|
if (-1 == gs_server_register_recv(iot_grapp_eth_meter_port_func)) {
|
||
|
goto error_5;
|
||
|
}
|
||
|
/* register callback function offered
|
||
|
* by proto layer for eth data recv
|
||
|
*/
|
||
|
greeapp->eth_dispatch_fntable[GR_MCU_OP_MODE] = \
|
||
|
iot_grapp_get_fn_send_to_ge(HOST_PORT_ETH);
|
||
|
/* register callback function offered
|
||
|
* by proto layer for eth data recv
|
||
|
*/
|
||
|
greeapp->eth_dispatch_fntable[GR_AT_OP_MODE] = \
|
||
|
iot_at_command_proto_send_to_at;
|
||
|
} else if (greeapp->host_port == HOST_PORT_MQTT) {
|
||
|
#if (IOT_GE_INCLUDE_LWMQTT)
|
||
|
iot_lwip_init();
|
||
|
|
||
|
lwmqtt_lwip_init();
|
||
|
|
||
|
iot_grapp_reg_fn_receive_from_ge(HOST_PORT_MQTT,
|
||
|
iot_grapp_lwmqtt_message_from_ge);
|
||
|
|
||
|
lwmqtt_register_fn_message_to_ge((void *)iot_grapp_lwmqtt_message_to_ge);
|
||
|
|
||
|
greeapp->mqtt_dispatch_fntable[GR_MCU_OP_MODE] = \
|
||
|
iot_grapp_get_fn_send_to_ge(HOST_PORT_MQTT);
|
||
|
#endif /* end IOT_GE_INCLUDE_LWMQTT */
|
||
|
} else if (greeapp->host_port == HOST_PORT_CUSTOM_TASK) {
|
||
|
#if (IOT_LED_CTRL_APP_ENABLE && PLC_SUPPORT_STA_ROLE)
|
||
|
iot_led_ctrl_task_init();
|
||
|
iot_led_ctrl_register_get_data_fn(iot_grapp_ledc_app_message_to_ge);
|
||
|
iot_grapp_reg_fn_receive_from_ge(HOST_PORT_CUSTOM_TASK,
|
||
|
iot_led_crtl_msg_post_to_led);
|
||
|
greeapp->app_dispatch_fntable[GR_MCU_OP_MODE] =
|
||
|
iot_grapp_get_fn_send_to_ge(HOST_PORT_CUSTOM_TASK);
|
||
|
#else
|
||
|
greeapp->app_dispatch_fntable[GR_MCU_OP_MODE] =
|
||
|
iot_grapp_get_fn_send_to_ge(HOST_PORT_CUSTOM_TASK);
|
||
|
#endif /* end (IOT_LED_CTRL_APP_ENABLE && PLC_SUPPORT_STA_ROLE) */
|
||
|
} else {
|
||
|
IOT_ASSERT(0);
|
||
|
/* Do nothing. */
|
||
|
}
|
||
|
|
||
|
/* register app to cvg layer */
|
||
|
greeapp->app_handle = iot_plc_register_app(&app);
|
||
|
if (greeapp->app_handle == NULL) {
|
||
|
ret = ERR_FAIL;
|
||
|
goto error_5;
|
||
|
}
|
||
|
|
||
|
#if PLC_SUPPORT_CCO_ROLE && ENABLE_GREE_UPGRADE
|
||
|
/* begin of online upgrade initialize gree upgrade info */
|
||
|
iot_proto_upgrade_initialize();
|
||
|
#endif
|
||
|
/* grapp init successful */
|
||
|
greeapp->grapp_init_success = true;
|
||
|
goto out;
|
||
|
|
||
|
error_5:
|
||
|
/* distinguish UART or ETH host port */
|
||
|
if (greeapp->host_port == HOST_PORT_UART) {
|
||
|
iot_grapp_close_uart();
|
||
|
} else {
|
||
|
goto error_4;
|
||
|
}
|
||
|
error_4:
|
||
|
#if IOT_GE_CKQ_MODE_ENABLE
|
||
|
iot_dev_test_task_deinit();
|
||
|
error_3:
|
||
|
#endif
|
||
|
#if INCLUDE_AT_COMMAND_MODULE
|
||
|
iot_at_task_deinit();
|
||
|
#else
|
||
|
goto error_2; /* Clear building error. */
|
||
|
#endif
|
||
|
error_2:
|
||
|
iot_plctxrx_task_deinit();
|
||
|
error_1:
|
||
|
iot_proto_task_deinit();
|
||
|
error_0:
|
||
|
os_mem_free(greeapp);
|
||
|
|
||
|
out:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* app_entry: entry for ping app
|
||
|
* @return:
|
||
|
* ERR_PENDING - if application want to delay the plc network formation.
|
||
|
* otherwise - plc network formation will be started automatically.
|
||
|
*/
|
||
|
uint32_t app_gr_app_entry(void)
|
||
|
{
|
||
|
uint32_t ret = ERR_PENDING;
|
||
|
|
||
|
/* enable cvg blower layer log */
|
||
|
iot_print_config(1);
|
||
|
/* enable app log */
|
||
|
iot_cus_print_config(1);
|
||
|
|
||
|
if (iot_gr_app_init()) {
|
||
|
ret = ERR_OK;
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|