103 lines
3.0 KiB
C
103 lines
3.0 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_proto.h"
|
|
#include "app_cus_task.h"
|
|
#include "app_proto_proc.h"
|
|
#include "app_proto_proc_cco.h"
|
|
|
|
uint8_t check_app_proto_frame(uint8_t * data, uint16_t data_length)
|
|
{
|
|
app_proto_frame_head *frame = (app_proto_frame_head *)data;
|
|
uint16_t frame_length;
|
|
uint16_t calc_crc;
|
|
uint8_t reason = 0;
|
|
uint8_t ret = true;
|
|
|
|
if ((data == NULL) || (data_length == 0)) {
|
|
reason = 1;
|
|
goto out;
|
|
}
|
|
|
|
frame_length = sizeof(app_proto_frame_head) + frame->length + PROTO_CRC_SIZE;
|
|
if (frame_length != data_length) {
|
|
reason = 2;
|
|
goto out;
|
|
}
|
|
|
|
if (frame->head != APP_FRAME_HEAD_BYTE) {
|
|
reason = 3;
|
|
goto out;
|
|
}
|
|
|
|
calc_crc = iot_getcrc16(data, frame_length, IOT_CRC16_TYPE_XMODEM);
|
|
if (calc_crc != 0) {
|
|
reason = 4;
|
|
goto out;
|
|
}
|
|
|
|
ret = false;
|
|
|
|
out:
|
|
if (ret) {
|
|
APP_PRINTF("[ERR] Check Frame Faild with reason[%d]", reason);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static void app_proto_data_parse(uint8_t *buffer, uint32_t buffer_len, app_source_e source)
|
|
{
|
|
app_proto_frame_rx(buffer, buffer_len, source, NULL);
|
|
}
|
|
|
|
/*
|
|
* Process data from PLC
|
|
*/
|
|
static void app_proto_data_handle(uint16_t data_id, uint16_t data_src,
|
|
uint8_t * data, uint32_t data_len, void *info)
|
|
{
|
|
recv_info_t *recv_info = (recv_info_t*)info;
|
|
|
|
if (data_id == ID_PLC_DATA_TRANSMIT) {
|
|
/* send to uart */
|
|
app_proto_data_transmit(data, data_len, recv_info->mac);
|
|
} else if (data_id == ID_PLC_REMOTE_CMD) {
|
|
#if PLC_SUPPORT_STA_ROLE
|
|
app_proto_frame_rx(data, data_len, data_src, recv_info->mac);
|
|
#else
|
|
/* send to uart */
|
|
app_proto_remote_cmd(data, data_len, recv_info->mac);
|
|
#endif
|
|
} else if (data_id == ID_PLC_SYSCTRL_DATA) {
|
|
app_proto_sysctrl_data_process(data, data_len, recv_info->mac, app_get_mac_addr());
|
|
} else if (data_id == ID_PLC_DATA_TEST) {
|
|
/* TODO */
|
|
} else {
|
|
APP_PRINTF("mode not support data");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void app_proto_init()
|
|
{
|
|
if (app_work_mode_register(APP_WORK_MODE_PROTO, app_proto_data_parse,
|
|
app_proto_data_handle, app_proto_onoffline_report)) {
|
|
}
|
|
|
|
return;
|
|
}
|
|
|