📄 sp30_drv.c
字号:
#include <poll.h>#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <ctype.h>#include "simdrv.h"#include "simu112.h"#include "simufunc.h"/* #include "sp30_drv.h" */#define MAX_FAIL_TIMES 4#define WAIT_TIME 5000#define RESULT_OTHER -4#define RESULT_NULL -5#define RESULT_BUSY -6#define RESULT_TIMEOUT -7#define BEGIN_PACK 0x00#define MIDDLE_PACK 0x01#define END_PACK 0x03#define MAX_RECEIVE_LEN 2048FILE *lp;int f_sp30_result_receive(int sock, unsigned char *szBuffer, int *len);int f_sp30_send_frame(int sock, unsigned char *buf, int len);int f_sp30_test_process(int port_fd, char *phone_number, TESTMSG * testmsg);void f_formulate(unsigned char *str, unsigned sno, unsigned rno, int len);void f_show_result(char *head, unsigned char *buf, int len);int f_link_switch(int port_fd);void f_send_ack(int port_fd);int f_sp30_access_line(int port_fd, char *phone_number, int max_retrys);int f_sp30_test_MLCT(int port_fd, int max_retrys);int f_sp30_test_V_R_CAP(int port_fd, int max_retrys, TESTMSG * testmsg);void f_sp30_stop_test(int port_fd);void f_sp30_release_line(int port_fd, char *phone_number);void f_sp30_make_phone_number(unsigned char *str, char *phone_number);void f_sp30_cal_result(unsigned char *result_str, TESTMSG * testmsg);int f_sp30_verify_package(unsigned char *str, int len);/* unsigned char login_frame[43]= { 0xFF,0xFF,0x41,0x30,0x22,0x00,0x00,0x00,0x27,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x91,0x79,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x39,0xFF,0xFE }; */unsigned char to_sno, to_rno, from_sno, from_rno;unsigned char receive_str[MAX_RECEIVE_LEN];int receive_len;int sp30_version;unsigned char manage_frame[9] ={0xff, 0xff, 0x00, 0x20, 0x00, 0x00, 0xe0, 0xff, 0xfe};unsigned char ack_frame[9] ={0xff, 0xff, 0x01, 0x10, 0x01, 0x00, 0x00, 0xff, 0xfe};unsigned char login_frame[43] ={ 0xFF, 0xFF, 0x41, 0x30, 0x22, 0x00, 0x00, 0x00, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFF, 0xFE};unsigned char access_line_frame[43] ={0xFF, 0xFF, 0x01, 0x30, 0x22, 0x00, 0x00, 0x00, 0x64, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x48, 0x58, 0xAA, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFE};/* pos: 2 - Sno|Rno 12 - start test(01) stop test(00) 13 - 00 */unsigned char test_frame[33] ={0xff, 0xff, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe};/* pos: 2 - Sno|Rno 12 - cmd no.(0x10-MLCT;0x11-V,R,CAP;0x19-END) 13 - 00 *//*********************************************************Function:void write_msg(char *head, unsigned char *msg, int msg_len)Narrative: Write vissible character to logfile.Param: char *head - a pointer to head of message unsigned char *msg - a pointer to recieved string int msg_len - length of recieved stringReturn: None.*********************************************************/void write_msg(char *head, unsigned char *msg, int msg_len){#ifdef DEBUG int i, j; char disp_buf[2048] = ""; /*f_show_result(head,msg,msg_len); */ for (i = 0; i < msg_len; i++) { j = strlen(disp_buf); sprintf(&disp_buf[j], "%02X,", (unsigned char) *(msg + i)); } fprintf(lp, "%s%s\n", head, disp_buf); fflush(lp);#endif}/*********************************************************Function:int sp30_proc(int port_fd, int version, char *phone_number, TESTMSG * testmsg)Narrative: Called in simdrv.c. It is the main flow of sp30_drv driver.Param: int port_fd - socket id int version - the software version of sp30 switch char *phone_number - char pointer to accessed telephone number string TESTMSG * testmsg - struct of test messageReturn: 0 OK or Null TelephoneNumber or Line Busy. AM_UNREADY_ERROR AM_NO_RESPONSE AM_PORT_DOWN AM_UNREADY_ERROR AM_TIME_OUT*********************************************************/int sp30_proc(int port_fd, int version, char *phone_number, TESTMSG * testmsg){ int ret; struct tm *ctime; time_t lt;#ifdef DEBUG lt = time(NULL); ctime = localtime(<); lp = backup_log("./sp30_drv.log"); fprintf(lp, "\n>>> Start SP30 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 sp30_version = version; ret = f_sp30_test_process(port_fd, phone_number, testmsg); write_msg("ret=", (unsigned char *) &ret, 4);#ifdef DEBUG lt = time(NULL); ctime = localtime(<); fprintf(lp, "\n>>> Stop SP30 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);}/* end of sp30_proc *//* Function sp30_conn_switch() Call by TST-QUERY Test Return: 0 OK -1 Can not connect Switch, or Switch no response -2 This value can not be returned *//*********************************************************Function:int sp30_conn_switch(int port_fd)Narrative: Detect if interface to switch runs well by sending a wakeup signal or a command.Param: int port_fd - socket id Return: 0 OK. -1 Switch port no ready.*********************************************************/int sp30_conn_switch(int port_fd){ int ret, ret_val; struct tm *ctime; time_t lt;#ifdef DEBUG lt = time(NULL); ctime = localtime(<); lp = backup_log("./sp30_drv.log"); fprintf(lp, "\n>>> Start SP30 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 ret = f_link_switch(port_fd); if (!ret) ret_val = -1; else ret_val = 0;#ifdef DEBUG lt = time(NULL); ctime = localtime(<); fprintf(lp, "\n>>> Stop SP30 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_val);}/*********************************************************Function:int f_sp30_test_process(int port_fd, char *phone_number, TESTMSG * testmsg)Narrative: Send test command to switch and get test value.Param: int port_fd - socket id char *phone_number - char pointer to accessed telephone number string TESTMSG * testmsg - struct of test messageReturn: 0 OK or line busy or invalid telephone number. AM_NO_RESPONSE Connect to switch port fail. AM_UNREADY_ERROR Unused.*********************************************************/int f_sp30_test_process(int port_fd, char *phone_number, TESTMSG * testmsg){ int i; int ret, retval = AM_UNREADY_ERROR; int flag; unsigned char this_to_sno; int max_retrys; flag = 0; to_sno = 0; to_rno = 0; from_sno = 0; from_rno = 0; /* send link frame -- "0xff 0xfe" */ flag = f_link_switch(port_fd); if (!flag) { write_msg("Fail!", (unsigned char *) "", 0); return (AM_NO_RESPONSE); } else { write_msg("Link Switch OK!", (unsigned char *) "", 0); } max_retrys = 12; flag = f_sp30_access_line(port_fd, phone_number, max_retrys); if (flag == 0) { write_msg("Access Line Fail!", (unsigned char *) "", 0); retval = AM_NO_RESPONSE; goto sp30_drv_exit1; } else if (flag == 1) write_msg("Access Line Succeed. Now we start test!", (unsigned char *) "", 0); else if (flag == 2) { write_msg("Line is NULL!", (unsigned char *) "", 0); strcpy(testmsg->TestResult.TestConclusion, "V08"); retval = 0; goto sp30_drv_exit1; } else { write_msg("Line Busy!", (unsigned char *) "", 0); strcpy(testmsg->TestResult.TestConclusion, "V6"); retval = 0; goto sp30_drv_exit1; } /* send link frame -- "0xff 0xfe" */ flag = f_link_switch(port_fd); if (!flag) { write_msg("Fail!", (unsigned char *) "", 0); retval = AM_NO_RESPONSE; goto sp30_drv_exit1; } else { write_msg("Wakeup OK!", (unsigned char *) "", 0); } /* start test MLCT */ max_retrys = 15; flag = f_sp30_test_MLCT(port_fd, max_retrys); if (flag) { if (flag == 1) { write_msg("Test MLCT Succeed!", (unsigned char *) "", 0); } else { write_msg("Test MLCT: High Volt!", (unsigned char *) "", 0); retval = 0; strcpy(testmsg->TestResult.TestConclusion, "V13"); goto sp30_drv_exit; } } else { write_msg("Test MLCT Fail!", (unsigned char *) "", 0); retval = AM_NO_RESPONSE; goto sp30_drv_exit; } /* send link frame -- "0xff 0xfe" */ flag = f_link_switch(port_fd); if (!flag) { write_msg("Fail!", (unsigned char *) "", 0); retval = AM_NO_RESPONSE; goto sp30_drv_exit; } else { write_msg("Wakeup OK!", (unsigned char *) "", 0); } /* start test V_R_CAP */ max_retrys = 20; flag = f_sp30_test_V_R_CAP(port_fd, max_retrys, testmsg); if (flag) { write_msg("Test V_R_CAP Succeed!", (unsigned char *) "", 0); retval = 0; } else { write_msg("Test V_R_CAP Fail!", (unsigned char *) "", 0); retval = AM_NO_RESPONSE; goto sp30_drv_exit; }sp30_drv_exit: f_sp30_stop_test(port_fd);sp30_drv_exit1: f_sp30_release_line(port_fd, phone_number); f_sp30_release_line(port_fd, phone_number); sleep(2); return retval;}/* end f_sp30_test_process *//*********************************************************Function:int f_sp30_result_receive(int sock, unsigned char *szBuffer, int *len)Narrative: Recieve responded string after send command.Param: int sock - socket id unsigned char *szBuffer - a pointer to receive_str int *len - a pointer to length of recieved stringReturn: 0 OK. -1 an error of hangup occur when reading. -2 No fd ready when timeout. -3 an error occur when performing poll or read.*********************************************************/int f_sp30_result_receive(int sock, unsigned char *szBuffer, int *len){ int p; int retval, ret, rc; unsigned char ch; unsigned char previous_char; struct pollfd pollfdsp[1]; int first_flag; pollfdsp[0].fd = sock; pollfdsp[0].events = POLLIN; pollfdsp[0].revents = 0; retval = 0; p = 0; previous_char = '\0'; memset(szBuffer, 0, MAX_RECEIVE_LEN); first_flag = 1; while (1) { ret = poll(pollfdsp, 1, WAIT_TIME); if (ret < 0) { retval = -3; break; } else if (ret == 0) { retval = -2; break; } if (pollfdsp[0].revents & POLLIN) { rc = read(sock, &ch, 1); if (rc < 0) { retval = -3; break; } if (rc == 0) { retval = -1; break; } switch (ch) { case 0xfe: if (!first_flag) { szBuffer[p] = ch; ++p; *len = p; if (previous_char == 0xff) { if (f_sp30_verify_package(receive_str, receive_len) == 0) return 0; else { write_msg("Can not pass verify!\n", receive_str, receive_len); return 1; /* Can not pass verify */ } } } break; case 0xff: if (first_flag) { first_flag = 0; } szBuffer[p] = ch; ++p; *len = p; break; case 0x00:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -