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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |