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