1194 lines
39 KiB
C
1194 lines
39 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.
|
|
|
|
****************************************************************************/
|
|
#include "os_timer_api.h"
|
|
#include "os_utils_api.h"
|
|
|
|
#include "iot_app_api.h"
|
|
#include "iot_io_api.h"
|
|
#include "iot_task_api.h"
|
|
#include "iot_edge_compute.h"
|
|
#include "iot_proto_common.h"
|
|
#include "iot_proto_dl645.h"
|
|
#include "iot_proto_ge.h"
|
|
#include "iot_bitmap_api.h"
|
|
#include "iot_app_cus_flash.h"
|
|
#include "iot_flashinfo.h"
|
|
|
|
#pragma pack(push) // save the pack status
|
|
#pragma pack(1) // 1 byte align
|
|
|
|
/* edge inner message */
|
|
enum
|
|
{
|
|
EDGE_INTERNAL_NEXT_CACHE_ID = 0x1,
|
|
EDGE_INTERNAL_UART_IDLE_ID,
|
|
};
|
|
|
|
/* edg timer message */
|
|
enum
|
|
{
|
|
/* edge starting stopping timer */
|
|
EDGE_MONITOR_START_STOP_ID = 0x1,
|
|
/* edge wait for uart respond */
|
|
EDGE_TIMEROUT_UART_READ_ID,
|
|
/* interval between two cache */
|
|
EDGE_TIMEROUT_NEXT_CACHE_ID,
|
|
};
|
|
|
|
enum
|
|
{
|
|
/* get start msg from proto, go into starting state */
|
|
edge_state_idle = 0,
|
|
/* no uart msg during start_stop timer, go into stated state */
|
|
edge_state_starting,
|
|
/* polling all cache cmd one by one each time */
|
|
edge_state_started,
|
|
/* no uart msg during start_stop timer, go into stopped state */
|
|
edge_state_stopping,
|
|
/* return uart handle to proto and go into idle state */
|
|
edge_state_stopped,
|
|
};
|
|
|
|
typedef uint8_t(* EDGE_FN_HANDLE)(uint8_t msg, uint8_t msg_id, void *arg);
|
|
|
|
typedef struct _iot_edge_fnhdl_tbl_t
|
|
{
|
|
/* each code handler */
|
|
EDGE_FN_HANDLE cmd_handle_fn;
|
|
} iot_edge_fnhdl_tbl_t;
|
|
|
|
#pragma pack(pop)
|
|
|
|
void iot_common_bin_dump(uint8_t *data, uint32_t dlen);
|
|
|
|
static uint8_t
|
|
iot_edge_state_idle_handler(uint8_t msg, uint8_t msg_id, void *arg);
|
|
static uint8_t
|
|
iot_edge_state_starting_handler(uint8_t msg, uint8_t msg_id, void *arg);
|
|
static uint8_t
|
|
iot_edge_state_started_handler(uint8_t msg, uint8_t msg_id, void *arg);
|
|
static uint8_t
|
|
iot_edge_state_stopping_handler(uint8_t msg, uint8_t msg_id, void *arg);
|
|
static uint8_t
|
|
iot_edge_state_stopped_handler(uint8_t msg, uint8_t msg_id, void *arg);
|
|
|
|
static iot_edge_fnhdl_tbl_t edge_state_hdl_tbl[] = {
|
|
{iot_edge_state_idle_handler},
|
|
{iot_edge_state_starting_handler},
|
|
{iot_edge_state_started_handler},
|
|
{iot_edge_state_stopping_handler},
|
|
{iot_edge_state_stopped_handler},
|
|
};
|
|
|
|
void iot_os_stop_timer_handle(timer_id_t tmr, uint16_t msg, uint8_t msg_id)
|
|
{
|
|
os_stop_timer(tmr);
|
|
iot_task_clean_msg(prototask_contxt.task_handle, msg, msg_id);
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_uart_send() - the edge send the data to uart
|
|
* @param p_pkt: the pkt of the data
|
|
* @retval: true or false
|
|
*/
|
|
static uint32_t iot_edge_uart_send(iot_pkt_t *p_pkt)
|
|
{
|
|
uint8_t ret = ERR_INVAL;
|
|
|
|
if (p_pkt != NULL) {
|
|
iot_cus_printf("[edge]send uart");
|
|
iot_common_bin_dump(iot_pkt_data(p_pkt), iot_pkt_data_len(p_pkt));
|
|
ret = iot_uart_send(prototask_contxt.edge_obj.uart_hdl, p_pkt, NULL);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_pickup_a_cmd() - to pick up a edge cmd to send to uart
|
|
* @param idx: point to the index of the data
|
|
* @retval: the idx of the cmd in edgecom_cmd_t array
|
|
if the idx is >= EDGECOM_MAX_CMD, means no cmd to pick now
|
|
*/
|
|
static uint8_t iot_edge_pickup_a_cmd(uint8_t *idx)
|
|
{
|
|
uint8_t ret = true;
|
|
uint8_t index;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
uint8_t *p_loop_cache_sign = (uint8_t*)&p_edge_obj->loop_cache_sign;
|
|
uint8_t *p_edge_cmd_sign = (uint8_t*)&p_edge_obj->cache_info.edge_cmd_sign;
|
|
|
|
for (index = 0; index < EDGECOM_MAX_CMD; index++) {
|
|
if ((iot_bitmap_is_set(p_loop_cache_sign, sizeof(uint32_t), index + 1)) &&
|
|
(iot_bitmap_is_set(p_edge_cmd_sign, sizeof(uint32_t), index + 1))) {
|
|
iot_bitmap_clear(p_loop_cache_sign, sizeof(uint32_t), index + 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(index >= EDGECOM_MAX_CMD) {
|
|
ret = false;
|
|
}
|
|
|
|
*idx = index;
|
|
return ret;
|
|
}
|
|
|
|
/* intercall */
|
|
static void edge_post_internal_msg_handle(uint8_t msg_id)
|
|
{
|
|
iot_proto_task_post_msg(EDGE_INTERNAL_MSG, msg_id, NULL, 0,
|
|
IOT_PROTO_TASK_QUEUE_LP);
|
|
}
|
|
|
|
/**
|
|
* @brief proto_post_data_to_edge_msg_handle() - to post msg data to edge
|
|
* @param msg_id: message id
|
|
* @param data: message data
|
|
* @param data_len: message data length
|
|
*/
|
|
void proto_post_data_to_edge_msg_handle(uint8_t msg_id, void *data,
|
|
uint16_t data_len)
|
|
{
|
|
uint8_t *pkt_data;
|
|
iot_pkt_t *pkt = NULL;
|
|
|
|
if (data != NULL && data_len) {
|
|
pkt = iot_pkt_alloc(data_len, IOT_GREE_APP_MID);
|
|
if (pkt == NULL) {
|
|
iot_cus_printf("[edge]alloc pkt size(%d) error\n", data_len);
|
|
IOT_ASSERT(0);
|
|
return;
|
|
}
|
|
pkt_data = iot_pkt_put(pkt, data_len);
|
|
os_mem_cpy(pkt_data, data, data_len);
|
|
}
|
|
|
|
iot_proto_task_post_msg(EDGE_INPUT_MSG, msg_id, pkt,
|
|
0, IOT_PROTO_TASK_QUEUE_LP);
|
|
}
|
|
|
|
/* timer */
|
|
/* for uart respond data time out */
|
|
static void post_uart_receive_timer_msg(timer_id_t timer_id, void * arg)
|
|
{
|
|
iot_proto_task_post_msg(EDGE_TIMER_MSG, EDGE_TIMEROUT_UART_READ_ID, arg,
|
|
0, IOT_PROTO_TASK_QUEUE_LP);
|
|
}
|
|
|
|
/* for edge in starting and stopping time out */
|
|
static void post_monitor_start_stop_timer_msg(timer_id_t timer_id, void * arg)
|
|
{
|
|
iot_proto_task_post_msg(EDGE_TIMER_MSG, EDGE_MONITOR_START_STOP_ID, arg,
|
|
0, IOT_PROTO_TASK_QUEUE_LP);
|
|
}
|
|
|
|
/* interval of two cache cmd */
|
|
static void post_next_cache_timer_msg(timer_id_t timer_id, void * arg)
|
|
{
|
|
iot_proto_task_post_msg(EDGE_TIMER_MSG, EDGE_TIMEROUT_NEXT_CACHE_ID, arg,
|
|
0, IOT_PROTO_TASK_QUEUE_LP);
|
|
}
|
|
|
|
/**
|
|
* @brief iot_load_edge_info_from_cus_flash() - load edge info from cus flash.
|
|
* @param edge_info: the edge info load from customer flash.
|
|
*/
|
|
static void iot_load_edge_info_from_cus_flash(edgecom_flash_info_t *edge_info)
|
|
{
|
|
uint8_t ret = 0;
|
|
|
|
ret = cus_app_flash_read(APP_FLASH_START_ADDR,
|
|
(uint8_t*)edge_info, sizeof(edgecom_flash_info_t));
|
|
if (ret == 0) {
|
|
// check magic
|
|
if ((edge_info->magic_start != IOT_PROTO_CUST_FLASHINFO_MAGIC1) ||
|
|
(edge_info->magic_end != IOT_PROTO_CUST_FLASHINFO_MAGIC2)) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
}
|
|
if (ret) {
|
|
iot_cus_printf("reset edge flash info\n");
|
|
os_mem_set(edge_info, 0, sizeof(edgecom_flash_info_t));
|
|
edge_info->magic_start = IOT_PROTO_CUST_FLASHINFO_MAGIC1;
|
|
edge_info->magic_end = IOT_PROTO_CUST_FLASHINFO_MAGIC2;
|
|
edge_info->cmd_tol_tm = UART_MAX_TIMEOUT;
|
|
edge_info->cmd_each_tm = UART_RX_TIMEOUT;
|
|
edge_info->cmd_starting_stopping_tm = EDGE_STARTING_STOPPING_TIMEOUT;
|
|
edge_info->cmd_inverval = UART_NEXT_CACHE_TIMEOUT;
|
|
} else {
|
|
iot_cus_printf("load edge flash info success\n");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief iot_save_edge_info_to_cus_flash() - save edge info to cusom flash.
|
|
* @param edge_info: the edge info will save to customer flash.
|
|
* @retval: - success return 0.
|
|
*/
|
|
uint8_t iot_save_edge_info_to_cus_flash(edgecom_flash_info_t *edge_info)
|
|
{
|
|
uint8_t ret = 0;
|
|
|
|
ret = cus_app_flash_write(APP_FLASH_START_ADDR, (uint8_t*)edge_info,
|
|
sizeof(edgecom_flash_info_t));
|
|
if (ret) {
|
|
iot_cus_printf("save edge flash info err\n");
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
uint8_t iot_edge_tmr_init(void)
|
|
{
|
|
uint8_t ret = 0;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
p_edge_obj->edge_monitor_start_stop_tmr =
|
|
os_create_timer(IOT_GREE_APP_MID, false,
|
|
post_monitor_start_stop_timer_msg, NULL);
|
|
if (p_edge_obj->edge_monitor_start_stop_tmr == 0) {
|
|
ret = 1;
|
|
goto error_0;
|
|
}
|
|
|
|
p_edge_obj->next_cache_tmr =
|
|
os_create_timer(IOT_GREE_APP_MID, false,
|
|
post_next_cache_timer_msg, NULL);
|
|
if (p_edge_obj->next_cache_tmr == 0) {
|
|
ret = 2;
|
|
goto error_1;
|
|
}
|
|
|
|
p_edge_obj->uart_rx_tmr =
|
|
os_create_timer(IOT_GREE_APP_MID, false,
|
|
post_uart_receive_timer_msg, NULL);
|
|
if (p_edge_obj->uart_rx_tmr == 0) {
|
|
ret = 3;
|
|
goto error_2;
|
|
}
|
|
|
|
goto success;
|
|
|
|
error_2:
|
|
os_delete_timer(p_edge_obj->next_cache_tmr);
|
|
error_1:
|
|
os_delete_timer(p_edge_obj->edge_monitor_start_stop_tmr);
|
|
error_0:
|
|
|
|
success:
|
|
iot_cus_printf("edge timer create ret=%d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
uint8_t iot_edge_get_device_data(uint8_t *pdata, uint8_t **dev_data,
|
|
uint8_t *dev_data_len)
|
|
{
|
|
uint8_t ret = false;
|
|
uint32_t di = 0;
|
|
proto_645_header_t *dl645_frm;
|
|
ge_frame_data_send_set_subfn160_t *p_data;
|
|
|
|
p_data = (ge_frame_data_send_set_subfn160_t *)pdata;
|
|
if ((p_data->hdr.hdr.fn != PROTO_GE_PLC_SET_CMD) ||
|
|
(p_data->hdr.subfn != PROTO_GE_DATA_CMD)) {
|
|
goto out;
|
|
}
|
|
|
|
if (p_data->resv == DL645_07_RESV0_RESV) {
|
|
dl645_frm = (proto_645_header_t *)p_data->data;
|
|
iot_proto_645_ext_sub33_handle(dl645_frm->data, dl645_frm->len);
|
|
proto_645_2007_byte_to_di(dl645_frm->data, di);
|
|
iot_cus_printf("[edge]recv di=%08X\n", di);
|
|
if ((di == DL645_07_DI_DL645_TYPE) || (di == DL645_07_DI_MODBUS_TYPE)) {
|
|
/* extend */
|
|
*dev_data = &dl645_frm->data[DL645_DI_LEN];
|
|
*dev_data_len = dl645_frm->len - DL645_DI_LEN;
|
|
iot_cus_printf("[edge]dump 645\n");
|
|
iot_common_bin_dump(*dev_data, *dev_data_len);
|
|
ret = true;
|
|
}
|
|
}
|
|
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_receive_data_handle() - to handle the data which received
|
|
from uart during edge running
|
|
* @param data: point to the data will send to PLC
|
|
* @param len length of the data
|
|
* @param idx the idx of the cmd in edgecom_cmd_t array, it means which
|
|
cmd is waiting for uart response
|
|
* @retval: true or false
|
|
*/
|
|
static uint8_t
|
|
iot_edge_receive_data_handle(uint8_t *data, uint8_t len, uint8_t idx)
|
|
{
|
|
uint8_t ret = false;
|
|
uint8_t *dev_data;
|
|
uint8_t dev_data_len;
|
|
/* point to data to check */
|
|
uint8_t *tmp_buf;
|
|
/* data cnt in each gree frame */
|
|
uint16_t data_len;
|
|
/* length of one gree frame */
|
|
uint16_t frame_len;
|
|
uint16_t cur_pos = 0;
|
|
uint32_t di;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edgecom_flash_info_t *p_cache_info =
|
|
&prototask_contxt.edge_obj.cache_info;
|
|
ge_frame_data_send_set_subfn160_t *p_ge_frame = NULL;
|
|
ge_frm_tail_t *p_ge_frame_tail = NULL;
|
|
proto_645_header_t *p_dl645_hdr = NULL;
|
|
proto_645_tailer_t *p_dl645_tail = NULL;
|
|
|
|
/* other cmd go to out */
|
|
do {
|
|
data_len = 0;
|
|
tmp_buf = data + cur_pos;
|
|
if (cur_pos >= (len - 1)) {
|
|
iot_cus_printf("[edge][err] pos=%d >= %d - 1\n", cur_pos, len);
|
|
break;
|
|
}
|
|
|
|
ret = ge_frame_data_len(tmp_buf, len - cur_pos, &data_len);
|
|
if (ret != ERR_OK) {
|
|
/* not get a complete frame */
|
|
iot_cus_printf("[edge][err] incomplete frame\n");
|
|
break;
|
|
}
|
|
|
|
frame_len = data_len + GE_FRM_MIN_LEN;
|
|
cur_pos += frame_len;
|
|
|
|
if (!iot_edge_get_device_data(tmp_buf, &dev_data, &dev_data_len)) {
|
|
continue;
|
|
}
|
|
|
|
if (iot_bitmap_is_set((uint8_t *)&p_cache_info->edge_cmd_sign,
|
|
sizeof(uint32_t), idx + 1)) {
|
|
if (os_mem_cmp(p_cache_info->cmd_list[idx].rx_buf, dev_data,
|
|
dev_data_len)) {
|
|
os_mem_cpy(p_cache_info->cmd_list[idx].rx_buf, dev_data,
|
|
dev_data_len);
|
|
p_cache_info->cmd_list[idx].rx_len = dev_data_len;
|
|
/* change 645 di */
|
|
proto_645_2007_byte_to_di(dev_data - DL645_DI_LEN, di);
|
|
if (di == DL645_07_DI_DL645_TYPE) {
|
|
di = idx + DL645_07_DI_EDGE_645_MIN_CMD;
|
|
} else {
|
|
di = idx + DL645_07_DI_EDGE_MODBUS_MIN_CMD;
|
|
}
|
|
|
|
p_ge_frame = (ge_frame_data_send_set_subfn160_t*)tmp_buf;
|
|
p_ge_frame_tail = (ge_frm_tail_t*)(tmp_buf + frame_len -
|
|
sizeof(ge_frm_tail_t));
|
|
p_dl645_hdr = (proto_645_header_t*)p_ge_frame->data;
|
|
proto_645_2007_di_to_byte(di, p_dl645_hdr->data);
|
|
iot_proto_645_ext_add33_handle(dev_data - DL645_DI_LEN,
|
|
dev_data_len + DL645_DI_LEN);
|
|
p_dl645_tail = (proto_645_tailer_t*)(p_dl645_hdr->data +
|
|
p_dl645_hdr->len);
|
|
/* change cs */
|
|
p_dl645_tail->cs =iot_proto_645_calc_cs(p_dl645_hdr);
|
|
/* change ge tail */
|
|
p_ge_frame_tail->check_sum = ge_frm_checksum_calc(tmp_buf,
|
|
frame_len- sizeof(ge_frm_tail_t));
|
|
ret = true;
|
|
} else {
|
|
iot_cus_printf("the cache data has not change\n");
|
|
continue;
|
|
}
|
|
} else {
|
|
iot_cus_printf("the cmd has been cancelled\n");
|
|
continue;
|
|
}
|
|
|
|
p_pkt = iot_pkt_alloc(frame_len, IOT_GREE_APP_MID);
|
|
if (p_pkt == NULL) {
|
|
iot_cus_printf("%s pkt Malloc Failed !!", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
os_mem_cpy(iot_pkt_put(p_pkt, frame_len), tmp_buf, frame_len);
|
|
iot_edge_post_to_proto_msg_handle(p_pkt, EDGE_OUTPUT_DL645_PKT_ID);
|
|
} while (cur_pos < len);
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_add_cache() - to add an edge cache cmd
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
*/
|
|
static void iot_edge_add_cache(uint8_t *data, uint16_t len)
|
|
{
|
|
uint8_t idx;
|
|
uint8_t tx_len;
|
|
edge_cache_cmd_info_t *p_data = (edge_cache_cmd_info_t *)data;
|
|
edgecom_flash_info_t *flash_info = &prototask_contxt.edge_obj.cache_info;
|
|
|
|
idx = p_data->idx;
|
|
tx_len = (uint8_t)(len - sizeof(edge_cache_cmd_info_t));
|
|
iot_bitmap_set((uint8_t *)&flash_info->edge_cmd_sign, sizeof(uint32_t),
|
|
idx + 1);
|
|
os_mem_cpy(flash_info->cmd_list[idx].tx_buf, p_data->data, tx_len);
|
|
flash_info->cmd_list[idx].tx_len = tx_len;
|
|
iot_save_edge_info_to_cus_flash(flash_info);
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_del_cache() - to cancel an edge cache cmd
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
*/
|
|
static void iot_edge_del_cache(uint8_t *data, uint16_t len)
|
|
{
|
|
(void)len;
|
|
uint8_t idx;
|
|
edge_cache_cmd_info_t *p_data = (edge_cache_cmd_info_t *)data;
|
|
edgecom_flash_info_t *flash_info = &prototask_contxt.edge_obj.cache_info;
|
|
|
|
idx = p_data->idx;
|
|
iot_bitmap_clear((uint8_t *)&flash_info->edge_cmd_sign, sizeof(uint32_t),
|
|
idx + 1);
|
|
os_mem_set(&flash_info->cmd_list[idx], 0, sizeof(edgecom_cmd_t));
|
|
iot_save_edge_info_to_cus_flash(flash_info);
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_query_cache_info_cache() - to get the information of
|
|
an edge cache cmd
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
*/
|
|
static void iot_edge_query_cache_info_cache(uint8_t *data, uint16_t len)
|
|
{
|
|
uint8_t pkt_len;
|
|
edge_cache_cmd_info_t *p_query_info = (edge_cache_cmd_info_t *)data;
|
|
uint8_t type = p_query_info->cmd_type;
|
|
uint8_t idx = p_query_info->idx;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edgecom_flash_info_t *flash_info = &prototask_contxt.edge_obj.cache_info;
|
|
|
|
pkt_len = sizeof(edge_cache_cmd_info_t) + flash_info->cmd_list[idx].tx_len;
|
|
p_pkt = iot_pkt_alloc(pkt_len, IOT_GREE_APP_MID);
|
|
if (!p_pkt) {
|
|
iot_cus_printf("%s no pkt\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
p_query_info = (edge_cache_cmd_info_t *)iot_pkt_put(p_pkt, pkt_len);
|
|
p_query_info->cmd_type = type;
|
|
p_query_info->idx = idx;
|
|
os_mem_cpy(p_query_info->data, flash_info->cmd_list[idx].tx_buf,
|
|
flash_info->cmd_list[idx].tx_len);
|
|
|
|
iot_edge_post_to_proto_msg_handle(p_pkt, EDGE_OUTPUT_RESP_CACHE_INFO_ID);
|
|
out:
|
|
return;
|
|
}
|
|
|
|
static void iot_edge_uart_rx_time_handle(edgecom_flash_info_t *cache_info)
|
|
{
|
|
if (cache_info->cmd_tol_tm < cache_info->cmd_each_tm) {
|
|
cache_info->cmd_each_tm = cache_info->cmd_tol_tm;
|
|
} else {
|
|
cache_info->cmd_tol_tm -= (cache_info->cmd_tol_tm %
|
|
cache_info->cmd_each_tm);
|
|
}
|
|
}
|
|
|
|
/* @brief iot_edge_delay_time_set_handle() - to set the information of
|
|
delay time
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
* @retval: point to the information
|
|
*/
|
|
static iot_pkt_t *
|
|
iot_edge_delay_time_set_handle(uint8_t *data, uint16_t len)
|
|
{
|
|
edge_delay_time_info_t *p_data = (edge_delay_time_info_t *)data;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
p_edge_obj->cache_info.cmd_inverval = p_data->cmd_inverval;
|
|
p_edge_obj->cache_info.cmd_tol_tm = p_data->cmd_tol_tm;
|
|
iot_edge_uart_rx_time_handle(&p_edge_obj->cache_info);
|
|
/* save to flash */
|
|
iot_save_edge_info_to_cus_flash(&p_edge_obj->cache_info);
|
|
return NULL;
|
|
}
|
|
|
|
/* @brief iot_edge_delay_time_inner_set_handle() - to set the inner delay time,
|
|
starting_stopping time and each overtime
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
* @retval: point to the information
|
|
*/
|
|
static iot_pkt_t *
|
|
iot_edge_delay_time_inner_set_handle(uint8_t *data, uint16_t len)
|
|
{
|
|
edge_delay_time_info_inner_t *p_data = (edge_delay_time_info_inner_t *)data;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
p_edge_obj->cache_info.cmd_starting_stopping_tm =
|
|
p_data->cmd_starting_stopping_tm;
|
|
p_edge_obj->cache_info.cmd_each_tm = p_data->cmd_each_tm;
|
|
|
|
iot_edge_uart_rx_time_handle(&p_edge_obj->cache_info);
|
|
/* save to flash */
|
|
iot_save_edge_info_to_cus_flash(&p_edge_obj->cache_info);
|
|
return NULL;
|
|
}
|
|
|
|
/* @brief iot_edge_baud_set_handle() - to set the edge command baud
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
*/
|
|
static void iot_edge_baud_set_handle(uint8_t *data, uint16_t len)
|
|
{
|
|
uint8_t i, j;
|
|
uint8_t cnt = *data;
|
|
edge_baud_cmd_t *edge_cmd = (edge_baud_cmd_t *)(data + 1);
|
|
edgecom_flash_info_t *cache_info = &prototask_contxt.edge_obj.cache_info;
|
|
uint8_t need_save_flash = 0;
|
|
|
|
if (cnt == 0) {
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < cnt; i++) {
|
|
j = edge_cmd->index - 1;
|
|
if (j < EDGECOM_MAX_CMD &&
|
|
(edge_cmd->baud_info.baud_idx !=
|
|
cache_info->baud_info[j].baud_idx ||
|
|
edge_cmd->baud_info.parity != cache_info->baud_info[j].parity)) {
|
|
/* change param */
|
|
cache_info->baud_info[j].baud_idx = edge_cmd->baud_info.baud_idx;
|
|
cache_info->baud_info[j].parity = edge_cmd->baud_info.parity;
|
|
need_save_flash = 1;
|
|
}
|
|
edge_cmd++;
|
|
}
|
|
|
|
/* save to flash */
|
|
if (need_save_flash) {
|
|
iot_save_edge_info_to_cus_flash(cache_info);
|
|
}
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_delay_time_query_handle() - to get the information of
|
|
delay time
|
|
*/
|
|
static void iot_edge_delay_time_query_handle(void)
|
|
{
|
|
uint8_t pkt_len = sizeof(edge_delay_time_info_t);
|
|
edgecom_flash_info_t *p_edge_obj = &prototask_contxt.edge_obj.cache_info;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edge_delay_time_info_t *p_time_info;
|
|
|
|
p_pkt = iot_pkt_alloc(pkt_len, IOT_GREE_APP_MID);
|
|
if (!p_pkt) {
|
|
iot_cus_printf("%s no pkt\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
p_time_info = (edge_delay_time_info_t *)iot_pkt_put(p_pkt, pkt_len);
|
|
p_time_info->cmd_inverval = p_edge_obj->cmd_inverval;
|
|
p_time_info->cmd_tol_tm = p_edge_obj->cmd_tol_tm;
|
|
iot_edge_post_to_proto_msg_handle(p_pkt, EDGE_OUTPUT_RESP_DELAY_TIME_ID);
|
|
out:
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_delay_time_inner_query_handle() - to get the information of
|
|
delay time
|
|
*/
|
|
static void iot_edge_delay_time_inner_query_handle(void)
|
|
{
|
|
uint8_t pkt_len = sizeof(edge_delay_time_info_inner_t);
|
|
edgecom_flash_info_t *p_edge_obj = &prototask_contxt.edge_obj.cache_info;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edge_delay_time_info_inner_t *p_time_info;
|
|
|
|
p_pkt = iot_pkt_alloc(pkt_len, IOT_GREE_APP_MID);
|
|
if (!p_pkt) {
|
|
iot_cus_printf("%s no pkt\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
p_time_info = (edge_delay_time_info_inner_t *)iot_pkt_put(p_pkt, pkt_len);
|
|
p_time_info->cmd_starting_stopping_tm = p_edge_obj->cmd_starting_stopping_tm;
|
|
p_time_info->cmd_each_tm = p_edge_obj->cmd_each_tm;
|
|
iot_edge_post_to_proto_msg_handle(p_pkt, EDGE_OUTPUT_RESP_DELAY_TIME_INNER_ID);
|
|
out:
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_baud_query_handle() - to get the information of baud
|
|
*/
|
|
static void iot_edge_baud_query_handle(void)
|
|
{
|
|
uint8_t i;
|
|
uint16_t pkt_len;
|
|
uint8_t *pkt_data;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edge_baud_cmd_t *p_baud_cmd;
|
|
edgecom_flash_info_t *p_cache_info = &prototask_contxt.edge_obj.cache_info;
|
|
|
|
pkt_len = sizeof(edge_baud_cmd_t) * EDGECOM_MAX_CMD + sizeof(uint8_t);
|
|
p_pkt = iot_pkt_alloc(pkt_len, IOT_GREE_APP_MID);
|
|
if (!p_pkt) {
|
|
iot_cus_printf("%s no pkt\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
pkt_data = iot_pkt_put(p_pkt, pkt_len);
|
|
*pkt_data = EDGECOM_MAX_CMD;
|
|
p_baud_cmd = (edge_baud_cmd_t *)(pkt_data + sizeof(uint8_t));
|
|
for (i = 0; i < EDGECOM_MAX_CMD; i++) {
|
|
p_baud_cmd->index = i + 1;
|
|
p_baud_cmd->baud_info.baud_idx = p_cache_info->baud_info[i].baud_idx;
|
|
p_baud_cmd->baud_info.parity = p_cache_info->baud_info[i].parity;
|
|
p_baud_cmd++;
|
|
}
|
|
|
|
iot_edge_post_to_proto_msg_handle(p_pkt, EDGE_OUTPUT_RESP_BAUD_ID);
|
|
out:
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_cache_cnt_query_handle() - to get the count of edge command
|
|
*/
|
|
static void iot_edge_cache_cnt_query_handle(void)
|
|
{
|
|
uint8_t pkt_len = sizeof(edge_cmd_cnt_t);
|
|
uint32_t edge_cmd_sign =
|
|
prototask_contxt.edge_obj.cache_info.edge_cmd_sign;
|
|
edge_cmd_cnt_t *cmd_cnt;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
|
|
p_pkt = iot_pkt_alloc(pkt_len, IOT_GREE_APP_MID);
|
|
if (!p_pkt) {
|
|
iot_cus_printf("%s no pkt\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
cmd_cnt = (edge_cmd_cnt_t *)iot_pkt_put(p_pkt, pkt_len);
|
|
cmd_cnt->cnt = (uint8_t)iot_bitmap_cbs((uint8_t *)&edge_cmd_sign,
|
|
sizeof(edge_cmd_sign));
|
|
iot_cus_printf("cache cnt = %d\n", cmd_cnt->cnt);
|
|
iot_edge_post_to_proto_msg_handle(p_pkt, EDGE_OUTPUT_RESP_CACHE_CNT_ID);
|
|
out:
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_input_cache_msg_id_handle() - to handle the message of edge
|
|
cmd
|
|
* @param msg_id: message id
|
|
* @param data: point to the data of cmd
|
|
* @param len length of the data
|
|
* @retval: true or false
|
|
*/
|
|
static uint8_t iot_edge_input_cache_msg_id_handle(uint8_t msg_id,
|
|
uint8_t *data, uint16_t len)
|
|
{
|
|
switch(msg_id) {
|
|
case EDGE_INPUT_ADD_CACHE_ID:
|
|
{
|
|
iot_edge_add_cache(data, len);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_DEL_CACHE_ID:
|
|
{
|
|
/* to do */
|
|
iot_edge_del_cache(data, len);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_QUERY_CACHE_INFO_ID:
|
|
{
|
|
/* to do */
|
|
iot_edge_query_cache_info_cache(data, len);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_SET_DELAY_TIME_ID:
|
|
{
|
|
iot_edge_delay_time_set_handle(data, len);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_QUERY_DELAY_TIME_ID:
|
|
{
|
|
iot_edge_delay_time_query_handle();
|
|
break;
|
|
}
|
|
case EDGE_INPUT_QUERY_CACHE_CNT_ID:
|
|
{
|
|
iot_edge_cache_cnt_query_handle();
|
|
break;
|
|
}
|
|
case EDGE_INPUT_SET_DELAY_TIME_INNER_ID:
|
|
{
|
|
iot_edge_delay_time_inner_set_handle(data, len);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_QUERY_DELAY_TIME_INNER_ID:
|
|
{
|
|
iot_edge_delay_time_inner_query_handle();
|
|
break;
|
|
}
|
|
case EDGE_INPUT_SET_BAUD_ID:
|
|
{
|
|
iot_edge_baud_set_handle(data, len);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_QUERY_BAUD_ID:
|
|
{
|
|
iot_edge_baud_query_handle();
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void iot_edge_init(void)
|
|
{
|
|
iot_load_edge_info_from_cus_flash(&prototask_contxt.edge_obj.cache_info);
|
|
}
|
|
|
|
void iot_edge_state_machine(uint8_t msg, uint8_t msg_id, void *arg)
|
|
{
|
|
uint8_t next_state;
|
|
uint8_t current_state = prototask_contxt.edge_obj.edge_state;
|
|
|
|
next_state = edge_state_hdl_tbl[current_state].cmd_handle_fn(msg, msg_id,
|
|
arg);
|
|
|
|
if (next_state != current_state) {
|
|
prototask_contxt.edge_obj.edge_state = next_state;
|
|
}
|
|
iot_cus_printf("[EDGE_SM]cur_state=%d, next_state=%d, msg=%d msg_id=%d\n",
|
|
current_state, next_state, msg, msg_id);
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_state_idle_handler() - to handle the idle state of edge
|
|
* @param msg: message type
|
|
* @param msg_id: message id
|
|
* @param arg: point to the data
|
|
* @retval: the next state of edge state machine
|
|
*/
|
|
static uint8_t
|
|
iot_edge_state_idle_handler(uint8_t msg, uint8_t msg_id, void *arg)
|
|
{
|
|
uint8_t next_state = edge_state_idle;
|
|
uint8_t *p_input_data = NULL;
|
|
uint8_t input_len = 0;
|
|
void **pp_output_data = NULL;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
if (arg != NULL) {
|
|
p_input_data = iot_pkt_data(arg);
|
|
input_len = iot_pkt_data_len(arg);
|
|
}
|
|
|
|
switch(msg)
|
|
{
|
|
case EDGE_INPUT_MSG:
|
|
{
|
|
if (msg_id == EDGE_INPUT_REQ_START_ID) {
|
|
if (p_edge_obj->cache_info.edge_cmd_sign) {
|
|
next_state = edge_state_starting;
|
|
p_edge_obj->uart_hdl = *(void**)p_input_data;
|
|
p_edge_obj->loop_cache_sign =
|
|
p_edge_obj->cache_info.edge_cmd_sign;
|
|
os_start_timer(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
p_edge_obj->cache_info.cmd_starting_stopping_tm);
|
|
} else {
|
|
p_pkt = iot_pkt_alloc(sizeof(uint32_t), IOT_GREE_APP_MID);
|
|
if (p_pkt == NULL) {
|
|
iot_cus_printf("%s pkt Malloc Failed!\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
pp_output_data = (void **)iot_pkt_put(p_pkt,
|
|
sizeof(uint32_t));
|
|
*pp_output_data = *(void **)iot_pkt_data(arg);
|
|
iot_edge_post_to_proto_msg_handle(p_pkt,
|
|
EDGE_OUTPUT_STOPPED_ID);
|
|
iot_cus_printf("[EDGE_SM_IDLE]edge no cache\n");
|
|
|
|
}
|
|
} else if (INPUT_PROTO_CHECK(msg_id)) {
|
|
iot_cus_printf("input_len= %d\n", input_len);
|
|
iot_common_bin_dump(p_input_data, input_len);
|
|
iot_edge_input_cache_msg_id_handle(msg_id, p_input_data,
|
|
input_len);
|
|
}
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
if (arg != NULL) {
|
|
iot_pkt_free(arg);
|
|
}
|
|
out:
|
|
return next_state;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_state_starting_handler() - to handle the starting state of
|
|
edge
|
|
* @param msg: message type
|
|
* @param msg_id: message id
|
|
* @param arg: point to the data
|
|
* @retval: the next state of edge state machine
|
|
*/
|
|
static uint8_t
|
|
iot_edge_state_starting_handler(uint8_t msg, uint8_t msg_id, void *arg)
|
|
{
|
|
uint8_t next_state = edge_state_starting;
|
|
uint8_t *p_input_data = NULL;
|
|
uint8_t input_len = 0;
|
|
void **pp_output_data = NULL;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
if (arg != NULL) {
|
|
p_input_data = iot_pkt_data(arg);
|
|
input_len = iot_pkt_data_len(arg);
|
|
}
|
|
|
|
switch(msg)
|
|
{
|
|
case EDGE_INPUT_MSG:
|
|
{
|
|
if (msg_id == EDGE_INPUT_REQ_STOPID_ID) {
|
|
p_pkt = iot_pkt_alloc(sizeof(uint32_t), IOT_GREE_APP_MID);
|
|
if (p_pkt == NULL) {
|
|
iot_cus_printf("%s pkt Malloc Failed!\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
pp_output_data = (void **)iot_pkt_put(p_pkt, sizeof(uint32_t));
|
|
*pp_output_data = p_edge_obj->uart_hdl;
|
|
p_edge_obj->uart_hdl = NULL;
|
|
iot_edge_post_to_proto_msg_handle(p_pkt,
|
|
EDGE_OUTPUT_STOPPED_ID);
|
|
iot_os_stop_timer_handle(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
EDGE_TIMER_MSG, EDGE_MONITOR_START_STOP_ID);
|
|
next_state = edge_state_idle;
|
|
} else if (INPUT_PROTO_CHECK(msg_id)) {
|
|
iot_edge_input_cache_msg_id_handle(msg_id, p_input_data,
|
|
input_len);
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_TIMER_MSG:
|
|
{
|
|
if (msg_id == EDGE_MONITOR_START_STOP_ID) {
|
|
edge_post_internal_msg_handle(EDGE_INTERNAL_UART_IDLE_ID);
|
|
next_state = edge_state_started;
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_UART_RX_MSG:
|
|
{
|
|
iot_os_stop_timer_handle(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
EDGE_TIMER_MSG, EDGE_MONITOR_START_STOP_ID);
|
|
os_start_timer(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
p_edge_obj->cache_info.cmd_starting_stopping_tm);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
if (arg != NULL) {
|
|
iot_pkt_free(arg);
|
|
}
|
|
out:
|
|
return next_state;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_state_started_handler() - to handle the started state of edge
|
|
* @param msg: message type
|
|
* @param msg_id: message id
|
|
* @param arg: point to the data
|
|
* @retval: the next state of edge state machine
|
|
*/
|
|
static uint8_t
|
|
iot_edge_state_started_handler(uint8_t msg, uint8_t msg_id, void *arg)
|
|
{
|
|
uint8_t next_state = edge_state_started;
|
|
uint8_t cmd_bit_idx;
|
|
uint8_t *p_input_data = NULL;
|
|
uint8_t input_len = 0;
|
|
iot_pkt_t *cmd_pkt = NULL;
|
|
/* point to the tx_buf of cmd */
|
|
uint8_t *tx_data;
|
|
/* length of tx_buf */
|
|
uint8_t tx_data_len;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
edgecom_cmd_t *p_cmd_list = prototask_contxt.edge_obj.cache_info.cmd_list;
|
|
|
|
if (arg != NULL) {
|
|
p_input_data = iot_pkt_data(arg);
|
|
input_len = iot_pkt_data_len(arg);
|
|
}
|
|
|
|
switch(msg)
|
|
{
|
|
case EDGE_INTERNAL_MSG:
|
|
{
|
|
if (msg_id == EDGE_INTERNAL_UART_IDLE_ID) {
|
|
edge_post_internal_msg_handle(EDGE_INTERNAL_NEXT_CACHE_ID);
|
|
} else if (msg_id == EDGE_INTERNAL_NEXT_CACHE_ID) {
|
|
if (iot_edge_pickup_a_cmd(&cmd_bit_idx)) {
|
|
tx_data_len = p_cmd_list[cmd_bit_idx].tx_len;
|
|
tx_data = p_cmd_list[cmd_bit_idx].tx_buf;
|
|
cmd_pkt = iot_pkt_alloc(tx_data_len, IOT_GREE_APP_MID);
|
|
if (cmd_pkt == NULL) {
|
|
iot_cus_printf("%s pkt Malloc Failed!\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
os_mem_cpy(iot_pkt_put(cmd_pkt, tx_data_len), tx_data,
|
|
tx_data_len);
|
|
p_edge_obj->cmd_bit_idx = cmd_bit_idx;
|
|
iot_edge_uart_send(cmd_pkt);
|
|
os_start_timer(p_edge_obj->uart_rx_tmr,
|
|
p_edge_obj->cache_info.cmd_each_tm);
|
|
p_edge_obj->uart_rx_total_time = 0;
|
|
} else {
|
|
iot_cus_printf("[EDGE_SM_STARTED][UART_RX_TIMEOUT]"
|
|
"from started to stopping\n");
|
|
next_state = edge_state_stopping;
|
|
os_start_timer(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
p_edge_obj->cache_info.cmd_starting_stopping_tm);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_INPUT_MSG:
|
|
{
|
|
if (msg_id == EDGE_INPUT_REQ_STOPID_ID) {
|
|
if (os_is_timer_active(p_edge_obj->next_cache_tmr)) {
|
|
iot_os_stop_timer_handle(p_edge_obj->next_cache_tmr,
|
|
EDGE_TIMER_MSG, EDGE_TIMEROUT_NEXT_CACHE_ID);
|
|
}
|
|
if (os_is_timer_active(p_edge_obj->uart_rx_tmr)) {
|
|
iot_os_stop_timer_handle(p_edge_obj->uart_rx_tmr,
|
|
EDGE_TIMER_MSG, EDGE_TIMEROUT_UART_READ_ID);
|
|
}
|
|
|
|
os_start_timer(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
p_edge_obj->cache_info.cmd_starting_stopping_tm);
|
|
iot_cus_printf("[EDGE_SM_STARTED]"
|
|
"[EDGE_STARTING_STOPPING_TIMEOUT]started to stopping\n");
|
|
next_state = edge_state_stopping;
|
|
} else if (INPUT_PROTO_CHECK(msg_id)) {
|
|
iot_edge_input_cache_msg_id_handle(msg_id, p_input_data,
|
|
input_len);
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_TIMER_MSG:
|
|
{
|
|
cmd_bit_idx = p_edge_obj->cmd_bit_idx;
|
|
if (msg_id == EDGE_TIMEROUT_UART_READ_ID) {
|
|
p_edge_obj->uart_rx_total_time +=
|
|
p_edge_obj->cache_info.cmd_each_tm;
|
|
if (p_edge_obj->uart_rx_total_time >=
|
|
p_edge_obj->cache_info.cmd_tol_tm) {
|
|
os_start_timer(p_edge_obj->next_cache_tmr,
|
|
p_edge_obj->cache_info.cmd_inverval);
|
|
} else {
|
|
tx_data_len = p_cmd_list[cmd_bit_idx].tx_len;
|
|
tx_data = p_cmd_list[cmd_bit_idx].tx_buf;
|
|
cmd_pkt = iot_pkt_alloc(tx_data_len, IOT_GREE_APP_MID);
|
|
if (cmd_pkt == NULL) {
|
|
iot_cus_printf("%s pkt Malloc Failed!\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
os_mem_cpy(iot_pkt_put(cmd_pkt, tx_data_len), tx_data,
|
|
tx_data_len);
|
|
iot_edge_uart_send(cmd_pkt);
|
|
os_start_timer(p_edge_obj->uart_rx_tmr,
|
|
p_edge_obj->cache_info.cmd_each_tm);
|
|
}
|
|
} else if (msg_id == EDGE_TIMEROUT_NEXT_CACHE_ID) {
|
|
edge_post_internal_msg_handle(EDGE_INTERNAL_NEXT_CACHE_ID);
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_UART_RX_MSG:
|
|
{
|
|
iot_os_stop_timer_handle(p_edge_obj->uart_rx_tmr,
|
|
EDGE_TIMER_MSG, EDGE_TIMEROUT_UART_READ_ID);
|
|
cmd_bit_idx = p_edge_obj->cmd_bit_idx;
|
|
os_start_timer(p_edge_obj->next_cache_tmr,
|
|
p_edge_obj->cache_info.cmd_inverval);
|
|
iot_edge_receive_data_handle(p_input_data, input_len, cmd_bit_idx);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
if (arg != NULL) {
|
|
iot_pkt_free(arg);
|
|
}
|
|
out:
|
|
return next_state;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_state_stopping_handler() - to handle the stopping state of
|
|
edge
|
|
* @param msg: message type
|
|
* @param msg_id: message id
|
|
* @param arg: point to the data
|
|
* @retval: the next state of edge state machine
|
|
*/
|
|
static uint8_t
|
|
iot_edge_state_stopping_handler(uint8_t msg, uint8_t msg_id, void *arg)
|
|
{
|
|
uint8_t next_state = edge_state_stopping;
|
|
uint8_t *p_input_data = NULL;
|
|
uint8_t input_len = 0;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
if (arg != NULL) {
|
|
p_input_data = iot_pkt_data(arg);
|
|
input_len = iot_pkt_data_len(arg);
|
|
}
|
|
|
|
switch(msg)
|
|
{
|
|
case EDGE_TIMER_MSG:
|
|
{
|
|
if (msg_id == EDGE_MONITOR_START_STOP_ID) {
|
|
edge_post_internal_msg_handle(EDGE_INTERNAL_UART_IDLE_ID);
|
|
iot_cus_printf("[EDGE_SM_STOPPING][EDGE_INTERNAL_UART_IDLE_ID]"
|
|
"from stopping to stopped\n");
|
|
next_state = edge_state_stopped;
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_UART_RX_MSG:
|
|
{
|
|
iot_os_stop_timer_handle(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
EDGE_TIMER_MSG, EDGE_MONITOR_START_STOP_ID);
|
|
os_start_timer(p_edge_obj->edge_monitor_start_stop_tmr,
|
|
p_edge_obj->cache_info.cmd_starting_stopping_tm);
|
|
p_edge_obj->debug_statistic_cnt.stopping_rxuart_cnt++;
|
|
iot_cus_printf("[EDGE_SM_STOPPING][EDGE_UART_RX_MSG]"
|
|
"receive data count %d\n",
|
|
p_edge_obj->debug_statistic_cnt.stopping_rxuart_cnt);
|
|
break;
|
|
}
|
|
case EDGE_INPUT_MSG:
|
|
{
|
|
if (INPUT_PROTO_CHECK(msg_id)) {
|
|
iot_edge_input_cache_msg_id_handle(msg_id, p_input_data,
|
|
input_len);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (arg != NULL) {
|
|
iot_pkt_free(arg);
|
|
}
|
|
return next_state;
|
|
}
|
|
|
|
/**
|
|
* @brief iot_edge_state_stopped_handler() - to handle the stopped state of edge
|
|
* @param msg: message type
|
|
* @param msg_id: message id
|
|
* @param arg: point to the data
|
|
* @retval: the next state of edge state machine
|
|
*/
|
|
static uint8_t
|
|
iot_edge_state_stopped_handler(uint8_t msg, uint8_t msg_id, void *arg)
|
|
{
|
|
uint8_t next_state = edge_state_stopped;
|
|
uint8_t *p_input_data = NULL;
|
|
uint8_t input_len = 0;
|
|
void **p_data;
|
|
iot_pkt_t *p_pkt = NULL;
|
|
edge_obj_t *p_edge_obj = &prototask_contxt.edge_obj;
|
|
|
|
if (arg != NULL) {
|
|
p_input_data = iot_pkt_data(arg);
|
|
input_len = iot_pkt_data_len(arg);
|
|
}
|
|
|
|
switch(msg)
|
|
{
|
|
case EDGE_INTERNAL_MSG:
|
|
{
|
|
if (msg_id == EDGE_INTERNAL_UART_IDLE_ID) {
|
|
p_pkt = iot_pkt_alloc(sizeof(uint32_t), IOT_GREE_APP_MID);
|
|
if (p_pkt == NULL) {
|
|
iot_cus_printf("%s pkt Malloc Failed!\n", __FUNCTION__);
|
|
goto out;
|
|
}
|
|
|
|
p_data = (void **)iot_pkt_put(p_pkt, sizeof(uint32_t));
|
|
*p_data = p_edge_obj->uart_hdl;
|
|
p_edge_obj->uart_hdl = NULL;
|
|
iot_edge_post_to_proto_msg_handle(p_pkt,
|
|
EDGE_OUTPUT_STOPPED_ID);
|
|
iot_cus_printf("[EDGE_SM_STOPPED][EDGE_OUTPUT_STOPPED_ID]"
|
|
"from stopped to idle\n");
|
|
next_state = edge_state_idle;
|
|
}
|
|
break;
|
|
}
|
|
case EDGE_INPUT_MSG:
|
|
{
|
|
if (INPUT_PROTO_CHECK(msg_id)) {
|
|
iot_edge_input_cache_msg_id_handle(msg_id, p_input_data,
|
|
input_len);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (arg != NULL) {
|
|
iot_pkt_free(arg);
|
|
}
|
|
out:
|
|
return next_state;
|
|
}
|
|
|