//////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_test.c.c /// @brief bsp @ driver config ///------------------------------------------------------------------------- /// @version 1.0 /// @author CC /// @date 20180331 /// @note cc_AS_stc02 ////////////////////////////////////////////////////////////////////////////// #include "task_w600.h" #include "app_config.h" #include "../msp/uart2.h" #include "../msp/uart0.h" struct _s_task_gm35_gprs_ s_task_gm35_flow; TS_tcp_control ts_tcp_control; TS_tcp ts_tcp; #define LEN_GPRS_TCP_PKG 18 U8 ins_cipsend[30] = "AT+CIPSEND=000\r\n"; U8 * _cipsend_hex(U8 len) { U8 pos = Lc_strlen("AT+CIPSEND="); ins_cipsend[pos++] = len % 1000 / 100 + '0'; ins_cipsend[pos++] = len % 100 / 10 + '0'; ins_cipsend[pos++] = len % 10 / 1 + '0'; return ins_cipsend; } void L3_gm35_send_str(U8 *str) { L0_uart2_sendstr(str); if(G.debug) { L0_uart0_sendstr(str); } } //将数据放入gm35待发送缓冲区 void L3_gm35_send_data(U8 *buf , U8 len) { L3_gm35_send_str(_cipsend_hex(len)); L0_uart2_sendArray(buf,len); if(G.debug) { L0_uart0_sendArray(buf,len); } } void L3_gm35_rcv_data(U8* buf,U8 num) { if(G.debug) { L0_uart0_sendstr("ATRCV="); L0_uart0_uchex(num); L0_uart0_sendArray(buf,num); } } U8 wifi_ins[64]; char *GET_WIFI_INS() { //AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" Lc_strcpy(wifi_ins,"AT+CWJAP_DEF=\""); Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),G.st_sid); Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),"\",\""); Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),G.st_pwd); Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),"\"\r\n"); return wifi_ins; } void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p) { if (1 == p->ok ) { U8 *pPara = p->buf + 1; s_task_gm35_flow.gprs_last_recv_stmp = s_nos_tick.t_1s; //通用判定 if(Lc_strStartsWith(pPara,"OK")) { s_task_gm35_flow.ins_ok = 1; } else if(Lc_strStartsWith(pPara,"ERROR")) { s_task_gm35_flow.st_error= 1; } //Station模式判定 if(s_task_gm35_flow.mode == W600_ST) { if(Lc_strStartsWith(pPara,"WIFI GOT IP")) { s_task_gm35_flow.st_wifi_ok = 1; } else if(Lc_strStartsWith(pPara,"ALREADY CONNECTED")) { s_task_gm35_flow.st_cip_ok = 1; } } //AP模式判定 else if(s_task_gm35_flow.mode == W600_AP) { if(Lc_strStartsWith(pPara,"+IPD,0")) { //解析协议,success //1将id,pwd放入寄存器2.ok=1 //失败不处理不设置标志位 //buf: [20]+IPD,0,5:#ccsens:ccsens123$ 后面没\0 //pPara: +IPD,0,5:#ccsens:ccsens123$ int j = 0 , len = p->buf[0]; p->buf[len+1] = 0;//在+IPD,0,5:#ccsens:ccsens123$后加0 for(j=0;jok = 0; } } //------------------------------------------------------ gm35 tasks -------------------------------- void L3_task_tcp_init(void) { L1_task_init(&ts_tcp.task); L3_task_s_go(ts_tcp,D_task_init); ts_tcp.slaverIndex = 0; ts_tcp.pkglen = 0; ts_tcp.retryTimes = 0; ts_tcp.ackFlag = 0; } void L3_task_tcp_control_init(void) { L1_task_init(&ts_tcp_control.task); L3_task_s_go(ts_tcp_control,D_task_init); ts_tcp_control.conn_ok_pool = 0; ts_tcp_control.tcp_send_stmp = 0; } void L3_task_gm35_flow_init(U8 mode) { L1_task_init(&s_task_gm35_flow.task); L3_task_s_go(s_task_gm35_flow,D_task_init); s_task_gm35_flow.mode = mode; s_task_gm35_flow.send = 0; #if 0 g_at_send_status.send_lock = 0; g_at_send_status.module_ok = 0; g_at_send_status.sim_ok = 0; g_at_send_status.net_ok = 0; g_at_send_status.gprs_ok = 0; g_at_send_status.conn_ok = 0; g_at_send_status.ins_stmp = 0; //每次发送指令时设置 g_at_send_status.heart_stmp = 0; //连接成功时设置 g_at_send_status.data_stmp = 0; g_at_send_status.sign_flag = 0; g_at_send_status.ack_flag = 0; g_at_send_status.gprs_last_recv_stmp = 0; //接收到指令时设置 g_at_send_status.tcp_last_recv_stmp = 0; //连接成功和接收到数据时设置 g_at_send_status.tcp_close_stmp = 0; //重新上电和检测到断开时设置 g_at_send_status.gm35_reboot_times = 0; //连接成功时清0 #endif } //------------------------ GM35 Flow Handle ----------------------------------- #define TTSS_TASK_GM35_MODE 0x01 #define TTSS_TASK_GM35_FLOW_ATEQV 0x02 #define TTSS_TASK_GM35_FLOW_ST 0x03 #define TTSS_TASK_GM35_FLOW_ST_WIFI 0x04 #define TTSS_TASK_GM35_FLOW_ST_CIPMUX0 0x05 #define TTSS_TASK_GM35_FLOW_ST_TCP 0x06 #define TTSS_TASK_GM35_FLOW_ST_CIPMODE1 0x07 #define TTSS_TASK_GM35_FLOW_ST_CIPSEND 0x08 #define TTSS_TASK_GM35_FLOW_ST_DATA 0x09 #define TTSS_TASK_GM35_FLOW_ST_CIPMODE0 0x10 #define TTSS_TASK_GM35_FLOW_AP 0x20 #define TTSS_TASK_GM35_FLOW_AP_WIFI 0x21 #define TTSS_TASK_GM35_FLOW_AP_CIPMUX1 0x22 #define TTSS_TASK_GM35_FLOW_AP_SERVER 0x23 #define TTSS_TASK_GM35_FLOW_TCP_TIME 0x24 #define TTSS_TASK_GM35_FLOW_AP_DATA 0x25 #define TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT 0x26 #define TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT 0x27 #define TTSS_TASK_MODE_TRAN 0x28 #define TTSS_TASK_MODE_SERVER_CLOSE 0x29 #define INS_TIMEOUT 5 #define GM35_SEND_DATA_INTERVAL 300 #define GM35_SEND_HEART_INTERVAL 60 #define GM35_SEND_CIPSTATUS_INTERVAL 5 void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) { TTSS_Task_init() L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_10s);//上电等待10s TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_ATE0); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(s->ins_ok == 1) //等待 { s->send = 0; L2_task_go_Tdelay(s->mode == W600_ST ? TTSS_TASK_GM35_FLOW_ST : TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_ST); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(s->ins_ok == 1) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_WIFI,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_WIFI) if(s->send == 0) {//发送 L3_gm35_send_str(GET_WIFI_INS()); s->ins_ok = 0; s->st_wifi_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok && 1 == s->st_wifi_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMUX0,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMUX0) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_ST_CIPMUX0); s->ins_ok = 0; s->st_wifi_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_TCP) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_ST_TCP); s->ins_ok = 0; s->st_cip_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok || 1 == s->st_cip_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMODE1) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_ST_CIPMODE1); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_3s); } else if(1 == s->st_error) { L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST,0); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND) L3_gm35_send_str(AT_INS_ST_CIPSEND); s->ins_ok = 0; s->conn_ok = 0; s->ins_stmp = s_nos_tick.t_1s; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_300ms); TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA) //L0_uart2_sendstr("abcdefg"); s->conn_ok = 1; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_3s); TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMODE0) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_ST_CIPMODE0); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_AP); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_WIFI,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_WIFI) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_AP_WIFI); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX1,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_CIPMUX1) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_AP_CIPMUX1); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_SERVER,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_SERVER) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_AP_SERVER); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_TCP_TIME,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_TCP_TIME) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_AP_TCP_TIME); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; s->ap_tcp_ok = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT,D_Tdelay_3s); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT) if(1 == s->ap_tcp_ok) { s->ap_conn_ok = 0; s->ap_tcp_ok = 0; s->ap_rec_ok = 0; s->ins_stmp = s_nos_tick.t_1s; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT,0); } TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT) if(1 == s->ap_rec_ok)//收到正确的数据才会ok=1 {//ok回复#ok$\r\n L0_uart0_sendstr("ap config ok"); L3_gm35_send_str(AT_INS_AP_SEND);//进入发送模式 L2_task_go_Tdelay(TTSS_TASK_MODE_TRAN,D_Tdelay_1s); } else if(1 == s->ap_conn_ok) { s->ap_conn_ok = 0; s->ap_tcp_ok = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX1,D_Tdelay_300ms); } TTSS_Task_step(TTSS_TASK_MODE_TRAN) if(s->send == 0) {//发送 L3_gm35_send_str("#OK$\r\n"); s->ins_ok = 0; s->ap_data_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ap_data_ok) //等待 { s->send = 0; s->ap_tcp_ok = 0; L2_task_go_Tdelay(TTSS_TASK_MODE_SERVER_CLOSE,D_Tdelay_3s); } TTSS_Task_step(TTSS_TASK_MODE_SERVER_CLOSE) if(s->send == 0) {//发送 L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; s->send = 1; } else if(1 == s->ins_ok) //等待 { s->send = 0; L3_task_gm35_flow_init(W600_ST); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; } TTSS_Task_end(); } #define D_task_tcp_constructor_modbus_pkg 0x41 #define D_task_tcp_send_modbus_pkg 0x42 #define D_task_tcp_wait_modbus_ack 0x43 #define D_task_tcp_switch_next_slaver 0x44 void L3_task_tcp_handle(TS_tcp *s) { TTSS_Task_init(); L2_task_go(D_task_tcp_constructor_modbus_pkg); TTSS_Task_step(D_task_tcp_constructor_modbus_pkg) //构造包 if(R.ccmd_slaver_info[s->slaverIndex].mask > 0) { s->pkglen = L3_pack_ccmodbus(&s->loopPkg,R.ccmd_slaver_info + s->slaverIndex); s->ackFlag = 0; s->retryTimes = 0; L2_task_go(D_task_tcp_send_modbus_pkg); } else { L2_task_go(D_task_tcp_switch_next_slaver); } TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包 L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); s->sendStamp = s_nos_tick.t_1s; if(R.ccmd_slaver_info[s->slaverIndex].mask == 1) { R.ccmd_slaver_info[s->slaverIndex].mask = 0; } L2_task_go(D_task_tcp_wait_modbus_ack); TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack if(s_uart2_tcp_rec.ok) { s_uart2_tcp_rec.ok = 0; s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num + 3); if(s->pAckPkg->slaver == R.ccmd_slaver_info[s->slaverIndex].slaver) { s->ackFlag = 1; } } if(s->ackFlag == 1 || s_nos_tick.t_1s - s->sendStamp >= 5) //收到ack或者超时 { L2_task_go(D_task_tcp_switch_next_slaver); } TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个 if(++ s->slaverIndex >= CCMD_SLAVER_INFO_MAX) { s->slaverIndex = 0; } L2_task_go(D_task_tcp_constructor_modbus_pkg); TTSS_Task_end(); } #define D_task_tcp_control_01 0x51 #define D_task_tcp_control_02 0x52 void L3_task_tcp_control_handle(TS_tcp_control *s) { TTSS_Task_init(); L2_task_go(D_task_tcp_control_01); TTSS_Task_step(D_task_tcp_control_01) if(s->conn_ok_pool != s_task_gm35_flow.conn_ok) { s->conn_ok_pool = s_task_gm35_flow.conn_ok; } L2_task_go(D_task_tcp_control_02); TTSS_Task_step(D_task_tcp_control_02) if(s_task_gm35_flow.conn_ok) { //3s一次发送数据包 if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) { R.ccmd_slaver_info[0].mask = 1; ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; } } L2_task_go(D_task_tcp_control_01); TTSS_Task_end(); } /********************************************************/