/* @STAY_FINAL_PROC */ /****************************************************************************** 版权所有 (C), 2001-2011, 上海全波通信技术有限公司 ****************************************************************************** 文 件 名 : swap_data.c 版 本 号 : 初稿 作 者 : 郭金涛 生成日期 : 2013年11月5日 最近修改 : 功能描述 : 实现数据导入导出交换功能,导出为二进制格式. 函数列表 : 修改历史 : 1.日 期 : 2013年11月5日 作 者 : 郭金涛 修改内容 : 创建文件 ******************************************************************************/ #include #include #include "type.h" #include "config.h" #if USE_SWAP_DATA //#include "stm32f4x7_eth.h" //#include "stm32f4x7_eth_bsp.h" #include "stm32f4xx_hal.h" #include "sockets.h" #include "os_task.h" #include "tcp_task.h" #include "cgifuncs.h" #include "os_task.h" #include "eeprom.h" #include "lcd_task.h" #include "i2c_drv.h" #include "uart_user.h" #include "tcp.h" #include "delay.h" #include "general_api.h" #include "sys_config.h" #include "swap_data.h" static uint8 swap_rec_buf[SWAP_REC_BUF_MAX]; static uint8 swap_send_buf[SWAP_SEND_BUF_MAX]; static uint32 swap_frame_check(uint32 len) { S_SWAP_FRAME *pframe= (S_SWAP_FRAME*)swap_rec_buf; if(lenheader!=SWAP_FRAME_HEADER) return 2; if(pframe->im_ex>=2) return 3; if(pframe->std!=EXCITER_ISDBT) //需根据当前激励器类型进行更改 return 4; if(swap_rec_buf[pframe->len+SWAP_FRAME_MIN_LEN-2]!=get_check_sum(swap_rec_buf,pframe->len+SWAP_FRAME_MIN_LEN-2)) return 5; if(swap_rec_buf[pframe->len+SWAP_FRAME_MIN_LEN-1]!=SWAP_FRAME_TAIL) return 6; return 0; } /***************************************************************************** 函 数 名 : swap_ex_exciter_para 功能描述 : 激励器参数导出实现主函数 输入参数 : void 输出参数 : 无 返 回 值 : static 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月11日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ static uint32 swap_ex_exciter_para(void) { S_SWAP_FRAME *pframe = (S_SWAP_FRAME*)swap_rec_buf; S_SWAP_FRAME *psend = (S_SWAP_FRAME*)swap_send_buf; uint32 send_len = 0; switch(pframe->cmd&0x7f) { case SWAP_FRAME_DATA_PARA: psend->len = sizeof(S_SYSTEM_PARA); psend->index = 0; psend->total = 0; memcpy(&psend->data[0],&atsc_para.system_para,sizeof(S_SYSTEM_PARA)); break; case SWAP_FRAME_DATA_DPD: break; default: return 0; } send_len = psend->len+SWAP_FRAME_MIN_LEN; return send_len; } /***************************************************************************** 函 数 名 : swap_im_exciter_para 功能描述 : 激励器数据导入实现主函数 输入参数 : void 输出参数 : 无 返 回 值 : static 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月11日 作 者 : 郭金涛 修改内容 : 新生成函数 *****************************************************************************/ static uint32 swap_im_exciter_para(void) { return 0; } static uint32 swap_frame_decode(void) { uint32 send_len = 0; S_SWAP_FRAME *pframe = (S_SWAP_FRAME*)swap_rec_buf; if(pframe->im_ex==SWAP_FRAME_EXPORT) { send_len = swap_ex_exciter_para(); } else { send_len = swap_im_exciter_para(); } return send_len; } static uint32 swap_frame_process(uint32 rec_len) { uint32 ret = 0; ret = swap_frame_check(rec_len); if(ret!=0) { swap_printf("swap rec frame format err! code:%d\n",ret); return 0; } return swap_frame_decode(); } void swap_data_task(void * pvParameters) { struct sockaddr_in server_addr; struct sockaddr_in conn_addr; int sock_fd; int sock_conn; socklen_t addr_len; int err; int length; task_set_ignore_chk(SWAP_TASK_ID); (void)pvParameters; vTaskDelay(15); printf("%s init start...\n",__FUNCTION__); sock_fd = lwip_socket(AF_INET, SOCK_STREAM, 0); if (sock_fd == -1) { printf("%s failed to create swap_data sock_fd!\n",__FUNCTION__); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr =htonl(INADDR_ANY); server_addr.sin_port = htons(SWAP_TCP_PORT); err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (err < 0) { printf("%s failed to bind sock_fd!\n",__FUNCTION__); } err = lwip_listen(sock_fd,1); if (err < 0) { printf("%s failed to listen sock_fd!\n",__FUNCTION__); } addr_len = sizeof(struct sockaddr_in); printf("%s init over.\n",__FUNCTION__); while(1) { sock_conn = lwip_accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len); while(sock_conn!=-1) { length = lwip_recv(sock_conn, swap_rec_buf, SWAP_REC_BUF_MAX, 0); if(length) { length = swap_frame_process(length); if(length) { lwip_send(sock_conn, swap_send_buf,length, 0); } } else { lwip_close(sock_conn); sock_conn = -1; break; } } } } #endif