📄 dms10_drv.c
字号:
#include <poll.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include "simu112.h"#include "simufunc.h"#include "simdrv.h"void get_three_item(char *ptr, char *dest1, char *dest2, char *dest3, int len);char *get_one_cmd(char *exk_number, char *phone_number);char *get_one_item(char *ptr, int position, int len);int dms10_conn_switch(int port_fd, char *password);int recv_msg_from_dms10(int port_fd, char *msg, int delay);int send_msg_to_dms10(int port_fd, char *msg);FILE *lp;static void f_writelog(FILE * lp, char *str){#ifdef DEBUG fprintf(lp, "%s\n", str);#endif}/*********************************************************Function:int dms10_proc(int port_fd, char *exk_number, char *phone_number, char *password, TESTMSG * testmsg)Narrative: Called in simdrv.c. It is the main flow of dms10_drv driver.Param: int port_fd - socket id char *exk_number - char pointer to exk_number stirng char *phone_number - char pointer to accessed telephone number string char *password - char pointer to switch port password TESTMSG * testmsg - struct of test messageReturn: 0 OK or Null TelephoneNumber or Line Busy. AM_UNREADY_ERROR AM_NO_RESPONSE AM_PORT_DOWN M_UNREADY_ERROR AM_TIME_OUT*********************************************************/int dms10_proc(int port_fd, char *exk_number, char *phone_number, char *password, TESTMSG * testmsg){ char msg_from_test[BUFSIZE]; char cmd_buf[81], line_buffer[81], temp1[20], temp2[20], temp3[20]; char *fptr, *ptr, *ptr_start; int len = 0, ret, i = 0; struct tm *ctime; time_t lt;#ifdef DEBUG lt = time(NULL); ctime = localtime(<); lp = backup_log("./dms10_drv.log"); /* lp=fopen("./dms10_drv.log","a+"); */ fprintf(lp, "\n>>> Start DMS10 Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year > 90 ? ctime->tm_year + 1900 : ctime->tm_year + 2000, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec); fflush(lp);#endif if ((ret = dms10_conn_switch(port_fd, password)) != AM_SUCCESS) { f_writelog(lp, "sorry,failed"); goto dms10_drv_exit; } f_writelog(lp, "link right!"); /*send command to switch port_fd */ f_writelog(lp, "Send TEST string!"); if ((ret = send_msg_to_dms10(port_fd, "TEST\r\n")) != AM_SUCCESS) goto dms10_drv_exit; sleep(3); if ((ret = recv_msg_from_dms10(port_fd, msg_from_test, 2000)) != AM_NO_RESPONSE) goto dms10_drv_exit; if (strstr(msg_from_test, "DN ") == NULL) goto dms10_drv_exit; /*send command to switch port_fd */ f_writelog(lp, "Send TelePhone Number string!"); strcpy(cmd_buf, get_one_cmd(exk_number, phone_number)); if ((ret = send_msg_to_dms10(port_fd, cmd_buf)) != AM_SUCCESS) goto dms10_drv_exit; /*receive the test data and process them */ sleep(4); if ((ret = recv_msg_from_dms10(port_fd, msg_from_test, 3000)) != AM_NO_RESPONSE) { if (strstr(msg_from_test, "LIT") == NULL) { sleep(1); f_writelog(lp, "The second time!"); if ((ret = recv_msg_from_dms10(port_fd, msg_from_test, 3000)) != AM_NO_RESPONSE) goto dms10_drv_exit; } } f_writelog(lp, "result:"); f_writelog(lp, msg_from_test); if (strstr(msg_from_test, "LIT") == NULL) { ret = AM_NO_RESPONSE; goto dms10_drv_exit; } ptr_start = msg_from_test; do { if ((fptr = ptr = strstr(ptr_start, "\r\n")) != NULL) { *ptr = '\0'; strcpy(line_buffer, ptr_start); ptr_start = ptr + 2; /*next line */ if (strstr(line_buffer, "LIT ") != NULL) { if (strstr(line_buffer, "FAIL") != NULL) strcpy(testmsg->TestResult.TestConclusion, "999"); } if (strstr(line_buffer, "LIT030") != NULL) { strcpy(testmsg->TestResult.TestConclusion, "V6"); /* Line Busy */ ret = AM_SUCCESS; break; } else if (strstr(line_buffer, "LIT300") != NULL) { strcpy(testmsg->TestResult.TestConclusion, "V08"); /* Line is NULL */ ret = AM_SUCCESS; break; } if ((ptr = strstr(line_buffer, "AC(VRMS)")) != NULL) { get_three_item(line_buffer, temp1, temp2, temp3, 2); strcpy(testmsg->TestResult.TG_ACvol, temp2); strcpy(testmsg->TestResult.RG_ACvol, temp3); continue; } if ((ptr = strstr(line_buffer, "DC(VOLTS)")) != NULL) { get_three_item(line_buffer, temp1, temp2, temp3, 2); strcpy(testmsg->TestResult.TG2_DCvol, temp2); strcpy(testmsg->TestResult.RG2_DCvol, temp3); continue; } if ((ptr = strstr(line_buffer, "RES(KOHM)")) != NULL) { get_three_item(line_buffer, temp1, temp2, temp3, 3); strcpy(testmsg->TestResult.TR2_DCres, temp1); strcpy(testmsg->TestResult.TG2_DCres, temp2); strcpy(testmsg->TestResult.RG2_DCres, temp3); continue; } if ((ptr = strstr(line_buffer, "CAP(UF)")) != NULL) { get_three_item(line_buffer, temp1, temp2, temp3, 2); strcpy(testmsg->TestResult.TR_cap, temp1); strcpy(testmsg->TestResult.TG_cap, temp2); strcpy(testmsg->TestResult.RG_cap, temp3); } } } while (fptr != NULL); ret = AM_SUCCESS;dms10_drv_exit: sleep(1); f_writelog(lp, "Send **** for end!"); send_msg_to_dms10(port_fd, "****"); sleep(2); f_writelog(lp, "Send LOGO for exit!"); send_msg_to_dms10(port_fd, "LOGO\r\n"); sleep(3);#ifdef DEBUG lt = time(NULL); ctime = localtime(<); fprintf(lp, "\n>>> Stop DMS10 Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year > 90 ? ctime->tm_year + 1900 : ctime->tm_year + 2000, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec); fflush(lp); fclose(lp);#endif return ret;}/*********************************************************Function:char *get_one_cmd(char *exk_number, char *phone_number)Narrative: Trim exk_number and generate test string.Param: char *exk_number - char pointer to exk_number stirng char *phone_number - char pointer to accessed telephone number string Return: a pointer to char array cmd_buf.*********************************************************/char *get_one_cmd(char *exk_number, char *phone_number){ int len = 0, i = 0; static char cmd_buf[81]; while (len < strlen(exk_number)) { if (*(exk_number + len) != ' ') break; else len++; } while (i < strlen(exk_number)) { if (*(exk_number + len + i) != ' ') { *(exk_number + i) = *(exk_number + len + i); i++; } else break; } *(exk_number + i) = '\0'; sprintf(cmd_buf, "%s %s\r\n", exk_number, phone_number + i); return cmd_buf;}/*********************************************************Function:void get_three_item(char *ptr, char *dest1, char *dest2, char *dest3, int len)Narrative: Get and transfer test value.Param: char *ptr - a pointer to recieved test result from switch. char *dest1 - a pointer to testing value. char *dest2 - a pointer to testing value. char *dest3 - a pointer to testing value. int len - lable of output format.Return: None.*********************************************************/void get_three_item(char *ptr, char *dest1, char *dest2, char *dest3, int len){ strcpy(dest1, get_one_item(ptr, 15, len)); strcpy(dest2, get_one_item(ptr, 23, len)); strcpy(dest3, get_one_item(ptr, 31, len));}/*********************************************************Function:char *get_one_item(char *ptr, int position, int len)Narrative: Get test value from recieved string from switch.Param: char *ptr - a pointer to recieved test result from switch. int position - query starting position. int len - lable of output format.Return: a pointer to testing value.*********************************************************/char *get_one_item(char *ptr, int position, int len){ static char item[20]; char temp[10]; float val; item[0] = '\0'; strncpy(temp, ptr + position, 8); temp[8] = '\0'; val = atof(temp); if (len = 2) sprintf(item, "%8.3f", val); else sprintf(item, "%9.3f", val); return (item);}/*********************************************************Function:int dms10_conn_switch(int port_fd, char *password)Narrative: Detect if interface to switch runs well by sending a wakeup signal or a command.Param: int port_fd - socket id char *password - char pointer to switch port passwordReturn: AM_SUCCESS OK. AM_NO_RESPONSE No fd ready when timeout. AM_MESSAGE_ERROR No expected string. AM_UNREADY_ERROR System busy.*********************************************************/int dms10_conn_switch(int port_fd, char *password){ char str[512], link_str[3][5] = {"****", "####", "!!!!"}; char passwd[64], disp[81]; int len, rc, ret, i; /* link to switch port_fd */ len = 0; do { sprintf(disp, "len:%d", len); f_writelog(lp, disp); for (i = 0; i < 3; i++) { write(port_fd, link_str[i], 4); f_writelog(lp, link_str[i]); if ((ret = recv_msg_from_dms10(port_fd, str, 2000)) == AM_NO_RESPONSE) { if (strlen(str) == 0) { len++; continue; } if (((strstr(str, " ! ") != NULL) && (strstr(str, "\r\n") == NULL)) || ((strstr(str, " # ") != NULL) && (strstr(str, "\r\n") == NULL)) || ((strstr(str, " > ") != NULL) && (strstr(str, "\r\n") == NULL))) break; } len++; } /*end for */ if (len < 20) break; } while (len < 20); if (i >= 3) return AM_NO_RESPONSE; if (strstr(str, " ! ") != NULL) { /* login and send password to switch port_fd for next step */ strcpy(passwd, password); strcat(passwd, "\r\n"); if ((ret = send_msg_to_dms10(port_fd, "LOGI\r\n")) != AM_SUCCESS) return ret; if ((ret = recv_msg_from_dms10(port_fd, str, 2000)) == AM_NO_RESPONSE) { if (strstr(str, "PASS?") != NULL) { if ((ret = send_msg_to_dms10(port_fd, passwd)) != AM_SUCCESS) return ret; if ((ret = recv_msg_from_dms10(port_fd, str, 2000)) == AM_NO_RESPONSE) { if (strstr(str, "LIT") == NULL) return AM_NO_RESPONSE; } else return AM_MESSAGE_ERROR; } else return AM_MESSAGE_ERROR; } else return AM_NO_RESPONSE; } if (strstr(str, " # ") != NULL) { /*begin the test function */ if ((ret = send_msg_to_dms10(port_fd, "OVLY LIT IMED\r\n")) != AM_SUCCESS) return ret; /*find the state of test,if '>',can execute test */ poll(0, 0, 4000); /*wait for 2 seconds */ ret = recv_msg_from_dms10(port_fd, str, 3000); if (ret != AM_NO_RESPONSE || !(strstr(str, "BUSY") != NULL || (strstr(str, " > ") != NULL) && (strstr(str, "LIT") != NULL))) { f_writelog(lp, "The second time!"); poll(0, 0, 1000); ret = recv_msg_from_dms10(port_fd, str, 3000); } if (ret == AM_NO_RESPONSE) { if (strstr(str, "BUSY") != NULL) return AM_UNREADY_ERROR; if ((strstr(str, " > ") != NULL) && (strstr(str, "LIT") != NULL)) return AM_SUCCESS; } } f_writelog(lp, "Link switch error!"); return AM_UNREADY_ERROR;}/*********************************************************Function:int recv_msg_from_dms10(int port_fd, char *msg, int delay)Narrative: Recieve return stirng from switch after sending command.Param: int port_fd - socket id char *msg - a pointer to array storing reciecved string from switch int delay - poll system call waiting timeReturn: 0 OK. AM_TIME_OUT An error of hangup occur when reading. AM_NO_RESPONSE No fd ready when timeout. AM_PORT_DOWN An error occur when performing poll or read.*********************************************************/int recv_msg_from_dms10(int port_fd, char *msg, int delay){ struct pollfd pollfdsp[1]; char ch, line_buffer[128], disp[81]; int len = 0, ret, rc; int line_count = 0; pollfdsp[0].fd = port_fd; pollfdsp[0].events = POLLIN; pollfdsp[0].revents = 0; *msg = '\0'; line_buffer[0] = '\0'; while (1) { ret = poll(pollfdsp, 1, delay); if (ret < 0) { return (AM_PORT_DOWN); } else if (ret == 0) { strcat(msg, line_buffer); if (strlen(line_buffer) > 0) f_writelog(lp, line_buffer); return (AM_NO_RESPONSE); } if (pollfdsp[0].revents & POLLIN) { rc = read(port_fd, &ch, 1); if (rc < 0) { return AM_PORT_DOWN; } if (rc == 0) { f_writelog(lp, "AM_TIME_OUT"); return AM_TIME_OUT; } if (ch != '\0') { line_buffer[len++] = ch; line_buffer[len] = '\0'; } else { len = 0; } if (ch == '\n') { line_count++; if (line_count > 30) { send_msg_to_dms10(port_fd, "!!!!"); return AM_TIME_OUT; } /*f_writelog(lp,line_buffer); */ if (strstr(line_buffer, "NO CARRIER") || strstr(line_buffer, "DISCONNECT") || strstr(line_buffer, "LOSS CD")) return AM_PORT_DOWN; if (strstr(line_buffer, "LIT")) strcat(msg, line_buffer); if (strstr(line_buffer, "AC(VRMS)")) strcat(msg, line_buffer); if (strstr(line_buffer, "DC(VOLTS)")) strcat(msg, line_buffer); if (strstr(line_buffer, "RES(KOHM)")) strcat(msg, line_buffer); if (strstr(line_buffer, "CAP(UF)")) strcat(msg, line_buffer); if (strstr(line_buffer, "BUSY")) strcat(msg, line_buffer); if (strstr(line_buffer, "PASS")) strcat(msg, line_buffer); if (strstr(line_buffer, "DN")) strcat(msg, line_buffer); } } } /*return AM_SUCCESS; */}/*********************************************************Function:int send_msg_to_dms10(int port_fd, char *msg)Narrative: Send command string to switch.Param: int port_fd - socket id char *msg - a pointer to array storing sending string to switchReturn: 0 OK. -1 Write error********************************************************/int send_msg_to_dms10(int port_fd, char *msg){ int i, ret; for (i = 0; i < strlen(msg); i++) { poll(0, 0, 5); ret = write(port_fd, (msg + i), 1); if (ret != 1) { f_writelog(lp, "write_error!"); return (ret); } } f_writelog(lp, "send:"); f_writelog(lp, msg); return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -