343 lines
9.6 KiB
C
343 lines
9.6 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 "app_uart.h"
|
|||
|
|
#include "app_main.h"
|
|||
|
|
#include "app_cus_task.h"
|
|||
|
|
#include "iot_plc_led_api.h"
|
|||
|
|
|
|||
|
|
#if (IOT_APP_SELECTION == IOT_APP_DEF_24_SILA_APP)
|
|||
|
|
#include "app_proto_proc.h"
|
|||
|
|
#include "sila_dev.h"
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
app_cus_task_t cus_task;
|
|||
|
|
|
|||
|
|
static uint16_t app_tx_to_cus_uart(uint8_t *data, uint16_t data_length)
|
|||
|
|
{
|
|||
|
|
iot_pkt_t *cus_pkt;
|
|||
|
|
|
|||
|
|
cus_pkt = iot_pkt_alloc(data_length, IOT_APP_DEMO_MID);
|
|||
|
|
if (NULL == cus_pkt) {
|
|||
|
|
APP_PRINTF("[ERR] %s Packet Alloc Failed !!", __FUNCTION__);
|
|||
|
|
return ERR_FAIL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
os_mem_cpy(iot_pkt_put(cus_pkt, data_length), (void *)data, data_length);
|
|||
|
|
|
|||
|
|
app_cus_task_msg_post(E_CUS_FROM_APPTASK_MSG, APP_CUS_TASK_MSG_ID_FROM_APP,
|
|||
|
|
(void*)cus_pkt);
|
|||
|
|
|
|||
|
|
return ERR_OK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if IOT_SILA_DEV_ENABLE
|
|||
|
|
/* Funtion used to send data to sila dev module. */
|
|||
|
|
static uint16_t app_tx_to_cus_device(app_proto_frame_head *p_frm)
|
|||
|
|
{
|
|||
|
|
return iot_sila_dev_plc_receive(p_frm->data, p_frm->length, p_frm->seq);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t cus_dev_tx_to_app_msg (uint8_t *p_data, uint32_t data_len, uint16_t seq)
|
|||
|
|
{
|
|||
|
|
iot_pkt_t *pkt;
|
|||
|
|
app_proto_frame_head *p_head;
|
|||
|
|
|
|||
|
|
iot_plc_led_request(IOT_PLC_LED_REQ_PLC_485_RX);
|
|||
|
|
|
|||
|
|
APP_PRINT_BUF("[CUS_DEV_TX_TO_APP]: ", p_data, data_len);
|
|||
|
|
|
|||
|
|
pkt = iot_pkt_alloc(data_len + sizeof(*p_head) + 2, IOT_APP_DEMO_MID);
|
|||
|
|
if (NULL == pkt) {
|
|||
|
|
APP_PRINTF("[ERR] %s Packet Alloc Failed !!", __FUNCTION__);
|
|||
|
|
return ERR_NOMEM;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
p_head = (app_proto_frame_head *)iot_pkt_put(pkt, data_len + sizeof(*p_head) + 2);
|
|||
|
|
|
|||
|
|
os_mem_cpy(p_head->data, p_data, data_len);
|
|||
|
|
|
|||
|
|
fill_proto_frame_fixed_info(p_head, ID_PROTO_CMD_SYSCTRL_DATA_TRANS, seq, data_len);
|
|||
|
|
|
|||
|
|
app_cus_task_msg_post(E_CUS_FROM_UART_MSG, APP_CUS_TASK_MSG_ID_UART, (void*)pkt);
|
|||
|
|
|
|||
|
|
return ERR_OK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 从app抛送uart消息到当前task处理,然后发送到串口 */
|
|||
|
|
uint16_t app_tx_to_cus_uart_msg(uint8_t *data, uint16_t data_length)
|
|||
|
|
{
|
|||
|
|
app_proto_frame_head *p_head = (app_proto_frame_head *)data;
|
|||
|
|
|
|||
|
|
if (NULL == data || data_length == 0) {
|
|||
|
|
APP_PRINTF("[ERR] %s Data is NULL !!", __FUNCTION__);
|
|||
|
|
return ERR_FAIL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
APP_PRINTF("[INF]PLC cmd id %x.\r\n", p_head->cmd);
|
|||
|
|
|
|||
|
|
if (ID_PROTO_CMD_SYSCTRL_DATA_TRANS == p_head->cmd) {
|
|||
|
|
APP_PRINT_BUF("[APP_TX_TO_CUS_DEV]", data, data_length);
|
|||
|
|
return app_tx_to_cus_device(p_head);
|
|||
|
|
} else {
|
|||
|
|
APP_PRINT_BUF("[APP_TX_TO_CUS_UART]", data, data_length);
|
|||
|
|
return app_tx_to_cus_uart(data, data_length);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#else /* IOT_SILA_DEV_ENABLE */
|
|||
|
|
|
|||
|
|
/* 从app抛送uart消息到当前task处理,然后发送到串口 */
|
|||
|
|
uint16_t app_tx_to_cus_uart_msg(uint8_t *data, uint16_t data_length)
|
|||
|
|
{
|
|||
|
|
if (NULL == data || data_length == 0) {
|
|||
|
|
APP_PRINTF("[ERR] %s Data is NULL !!", __FUNCTION__);
|
|||
|
|
return ERR_FAIL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return app_tx_to_cus_uart(data, data_length);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif /* IOT_SILA_DEV_ENABLE */
|
|||
|
|
|
|||
|
|
/* 将串口数据发送到app_main task 中处理 */
|
|||
|
|
uint16_t cus_tx_to_app_uart_msg(app_cus_task_msg_t *msg)
|
|||
|
|
{
|
|||
|
|
/* post msg to app_msg_task */
|
|||
|
|
app_post_msg(E_APP_MSG_PROCESS, E_CMD_ID_RCV_FROM_UART, (iot_pkt_t*)msg->data);
|
|||
|
|
|
|||
|
|
return ERR_OK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 定义msg post 函数 */
|
|||
|
|
void app_cus_task_msg_post(uint16_t msg_type, uint16_t msg_id, iot_pkt_t *data)
|
|||
|
|
{
|
|||
|
|
iot_task_msg_t *msg;
|
|||
|
|
app_cus_task_msg_t *task_msg;
|
|||
|
|
msg = iot_task_alloc_msg_with_reserved(cus_task.task, 0);
|
|||
|
|
if (NULL == msg) {
|
|||
|
|
if (NULL != data) {
|
|||
|
|
iot_pkt_free(data);
|
|||
|
|
}
|
|||
|
|
IOT_ASSERT(0);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
task_msg = (app_cus_task_msg_t*)msg;
|
|||
|
|
task_msg->msg.type = msg_type;
|
|||
|
|
task_msg->msg.id = msg_id;
|
|||
|
|
task_msg->data = data;
|
|||
|
|
iot_task_queue_msg(cus_task.task, &task_msg->msg, 0);
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* timer handle, post message to task for handle */
|
|||
|
|
static void app_cus_task_peroid_timer_exe(timer_id_t timer_id, void *arg)
|
|||
|
|
{
|
|||
|
|
(void)arg;
|
|||
|
|
if (timer_id == cus_task.peroid_timer) {
|
|||
|
|
app_cus_task_msg_post(E_CUS_PEROID_TIMER_MSG,
|
|||
|
|
APP_CUS_TASK_MSG_ID_PEROID_TMR, NULL);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* handle data received from uart */
|
|||
|
|
static void cus_task_uart_msg_handle_func(app_cus_task_msg_t *msg)
|
|||
|
|
{
|
|||
|
|
cus_tx_to_app_uart_msg(msg);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* handle data from local timer */
|
|||
|
|
static void cus_task_timer_msg_handle_func(app_cus_task_msg_t *msg)
|
|||
|
|
{
|
|||
|
|
switch(msg->msg.id)
|
|||
|
|
{
|
|||
|
|
case E_CUS_PEROID_TIMER_MSG:
|
|||
|
|
{
|
|||
|
|
// APP_PRINTF("PEROID TIMER FIRED\n");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* handle data from app_msg_task */
|
|||
|
|
static void cus_task_app_msg_handle_func(app_cus_task_msg_t *msg)
|
|||
|
|
{
|
|||
|
|
switch(msg->msg.id)
|
|||
|
|
{
|
|||
|
|
case APP_CUS_TASK_MSG_ID_FROM_APP:
|
|||
|
|
{
|
|||
|
|
iot_plc_led_request(IOT_PLC_LED_REQ_PLC_485_TX);
|
|||
|
|
iot_uart_send(cus_task.uart_h, (iot_pkt_t*)msg->data, NULL);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 当前task事件处理函数 */
|
|||
|
|
static void app_cus_event_handle(iot_task_h task_h, uint32_t event)
|
|||
|
|
{
|
|||
|
|
(void)task_h;
|
|||
|
|
(void)event;
|
|||
|
|
|
|||
|
|
APP_PRINTF("[INF] %s", __FUNCTION__);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 当前task消息处理函数 */
|
|||
|
|
static void app_cus_handle(iot_task_h task_h, iot_task_msg_t *msg)
|
|||
|
|
{
|
|||
|
|
app_cus_task_msg_t *dm_msg = (app_cus_task_msg_t *)msg;
|
|||
|
|
|
|||
|
|
(void)task_h;
|
|||
|
|
|
|||
|
|
if ((NULL == dm_msg) || (!APP_CUS_VALID(dm_msg->msg.type))) {
|
|||
|
|
/* Maybe this can cause memory overflow! */
|
|||
|
|
APP_PRINTF("[ERR] %s Invalid MSG !!", __FUNCTION__);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (dm_msg->msg.type)
|
|||
|
|
{
|
|||
|
|
case E_CUS_FROM_UART_MSG:
|
|||
|
|
{
|
|||
|
|
cus_task_uart_msg_handle_func(dm_msg);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case E_CUS_PEROID_TIMER_MSG:
|
|||
|
|
{
|
|||
|
|
cus_task_timer_msg_handle_func(dm_msg);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case E_CUS_FROM_APPTASK_MSG:
|
|||
|
|
{
|
|||
|
|
cus_task_app_msg_handle_func(dm_msg);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* need free task message */
|
|||
|
|
iot_task_free_msg(task_h, msg);
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void app_cus_common_cancel(uint16_t id, void *data)
|
|||
|
|
{
|
|||
|
|
iot_pkt_t *pkt = (iot_pkt_t*)data;
|
|||
|
|
|
|||
|
|
if (pkt) {
|
|||
|
|
iot_pkt_free(pkt);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
(void)id;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* function pointer to handle message canceling, use iot_task_clean_msg cancel */
|
|||
|
|
static void app_cus_cancel(iot_task_h task_h, iot_task_msg_t *msg)
|
|||
|
|
{
|
|||
|
|
app_cus_task_msg_t *dm_msg = (app_cus_task_msg_t *)msg;
|
|||
|
|
|
|||
|
|
(void)task_h;
|
|||
|
|
|
|||
|
|
if ((NULL == dm_msg) || (!APP_CUS_VALID(dm_msg->msg.type))) {
|
|||
|
|
/* Maybe this can cause memory overflow! */
|
|||
|
|
APP_PRINTF("[ERR] CANCEL AN INVALID MSG !!");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((E_CUS_FROM_UART_MSG == dm_msg->msg.type)
|
|||
|
|
||(E_CUS_FROM_APPTASK_MSG == dm_msg->msg.type)
|
|||
|
|
||(E_CUS_PEROID_TIMER_MSG == dm_msg->msg.type)) {
|
|||
|
|
app_cus_common_cancel(dm_msg->msg.id, dm_msg->data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
iot_task_free_msg(task_h, &(dm_msg->msg));
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* app 初始化, 创建task, timer等 */
|
|||
|
|
uint16_t app_cus_task_init(void)
|
|||
|
|
{
|
|||
|
|
iot_task_config_t t_cfg;
|
|||
|
|
|
|||
|
|
os_mem_set(&cus_task, 0x0, sizeof(cus_task));
|
|||
|
|
|
|||
|
|
os_mem_set(&t_cfg, 0x0, sizeof(t_cfg));
|
|||
|
|
t_cfg.stack_size = 0;
|
|||
|
|
/* task priority */
|
|||
|
|
t_cfg.task_prio = APP_CUS_HANDLE_TASK_PRIO;
|
|||
|
|
t_cfg.msg_size = sizeof(app_cus_task_msg_t);
|
|||
|
|
/* task message count */
|
|||
|
|
t_cfg.msg_cnt = APP_CUS_PENDING_LIMIT;
|
|||
|
|
/* task message queue count */
|
|||
|
|
t_cfg.queue_cnt = APP_CUS_TASK_PRIO_QUE;
|
|||
|
|
t_cfg.queue_cfg[0].quota = 0;
|
|||
|
|
t_cfg.task_event_func = app_cus_event_handle; /* 事件处理函数 */
|
|||
|
|
t_cfg.msg_exe_func = app_cus_handle; /* 消息处理函数 */
|
|||
|
|
/* function pointer to handle message canceling */
|
|||
|
|
t_cfg.msg_cancel_func = app_cus_cancel;
|
|||
|
|
|
|||
|
|
/* 创建task */
|
|||
|
|
cus_task.task = iot_task_create(IOT_APP_DEMO_MID, &t_cfg);
|
|||
|
|
if (NULL == cus_task.task) {
|
|||
|
|
APP_PRINTF("[ERR] %s Create Task Failed !!", __FUNCTION__);
|
|||
|
|
return ERR_FAIL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 串口初始化 */
|
|||
|
|
if (ERR_OK != app_uart_init(&(cus_task.uart_h))) {
|
|||
|
|
APP_PRINTF("[ERR] UART INIT FAILED !!");
|
|||
|
|
return ERR_FAIL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if IOT_SILA_DEV_ENABLE
|
|||
|
|
iot_sila_dev_init();
|
|||
|
|
iot_sila_dev_plc_send_register(cus_dev_tx_to_app_msg);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/* 创建定时器 */
|
|||
|
|
cus_task.peroid_timer = os_create_timer(IOT_APP_DEMO_MID, true,
|
|||
|
|
app_cus_task_peroid_timer_exe, NULL);
|
|||
|
|
|
|||
|
|
if (0 == cus_task.peroid_timer) {
|
|||
|
|
iot_cus_printf("[cus_task]create cmd timer failed.\n");
|
|||
|
|
return ERR_FAIL;
|
|||
|
|
}
|
|||
|
|
/* 启动定时器 */
|
|||
|
|
os_start_timer(cus_task.peroid_timer, APP_CUS_TASK_TIMER_PERIOD);
|
|||
|
|
|
|||
|
|
return ERR_OK;
|
|||
|
|
}
|