📄 simuresp.c
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <time.h>#include <string.h>#include "simu112.h"#include "simuintp.h"#ifdef WIN32_ENV#include <WINSOCK.H>#else#include <unistd.h>#endifstatic int driverResponse2(int fd, void *buffer, int cnt);extern SOCKETSTRUCT so[MAX_FD];extern int get_vercode_from_result(char *result, char *vername);/* This function added to handle more than one command in same buffer */int driverResponse(int fd, void *buffer, int cnt){ int c; if (buffer == NULL) { c = driverResponse2(fd, buffer, cnt); return c; } for (;;) { c = driverResponse2(fd, buffer, cnt); if (c == 0) break; if (c == cnt) break; cnt = c; } return c;}static int driverResponse2(int fd, void *buffer, int cnt){ int count, i; time_t tt; struct tm *ptm; char *tmp_ptr; int ver_code; CLIENT_STATUS *cs_ptr; DRIVER_STATUS *drv_ptr; TESTMSG test_msg; int sd; char buf[16]; char vercode_str[30]; char vername[10]; if (buffer == NULL) { /* EOF on driver port */ so_close(fd); /* so_close driver socket */ return (0); } /*if ((tmp_ptr = strchr(buffer, ';')) == NULL) return (cnt); entire command not yet received */ tmp_ptr = (char *) buffer; i = 0; while (*tmp_ptr != ';') { tmp_ptr++; i++; if (i >= so[fd].readOffset) return (cnt); } count = tmp_ptr - (char *) buffer + 1; /* length of response */ /* copy command into cmd buffer so we can play with it */ memset((void *) &test_msg, 0, sizeof(TESTMSG)); /* test for command too long */ /* note we fall thru with partial command which should error */ if (count > (sizeof(TESTMSG))) { i = sizeof(TESTMSG); } else { i = count; } memcpy((void *) &test_msg, buffer, i); /* move any remaining chars in buffer to beginning, adjust count */ i = 0; if (cnt > count) { for (; i < (cnt - count); i++) *((char *) buffer + i) = *((char *) buffer + i + count); } memset(((char *) buffer + i), 0, count); /* zero remainder of buffer */ cnt -= count; if (cnt < 0) cnt = 0; /*determine which ts_port the result come from */ for (drv_ptr = so[fd].driverStatus; drv_ptr; drv_ptr = drv_ptr->next) { if (strcmp(drv_ptr->ctag, test_msg.CorrelationTag) == 0) break; } if (!drv_ptr) { /*abort response */ /*printf("drv_ptr NULL!,abort response!\n"); */ } else { sd = drv_ptr->client_fd;/* if(sd==-1){ return cnt; } */ /*find client status */ for (cs_ptr = so[sd].clientStatus; cs_ptr; cs_ptr = cs_ptr->next) { if (strcmp(cs_ptr->test_req_msg.CorrelationTag, test_msg.CorrelationTag) == 0) break; } if (!cs_ptr) { /*abort response */ /*printf("cs_ptr NULL!,abort response!\n"); */ } else { switch (test_msg.CommandType) { case TST_QUERY: /*process the result of this special command */ if (strncmp(test_msg.TestResult.TestConclusion, "ok", 2) == 0) { time(&tt); ptm = localtime(&tt); sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response), " %04d-%02d-%02d %02d:%02d:%02d\r\nM %s COMPLD\r\n \"V=0,\"\r\n;", ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, test_msg.CorrelationTag); } else { buf[0] = 'S'; strncpy(&buf[1], test_msg.TestResult.TestConclusion, 3); buf[4] = '\0'; for (i = 0; i < NUMBER_ERROR_CODES; i++) { if (strcmp(buf, ErrorCodeDefinitions[i]) == 0) break; } if (i < NUMBER_ERROR_CODES) deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, SERR(i)); else { /*can't access the cause of line error */ deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, S305); } } so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response)); break; case TST_FULL: case TST_LOOP: if (test_msg.Error[0] != '\0') { buf[0] = 'S'; strncpy(&buf[1], test_msg.Error, 3); buf[4] = '\0'; for (i = 0; i < NUMBER_ERROR_CODES; i++) { if (strcmp(buf, ErrorCodeDefinitions[i]) == 0) break; } if (i < NUMBER_ERROR_CODES) deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, SERR(i)); else { /*can't access the cause of line error */ deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, S305); } so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response)); } else { time(&tt); ptm = localtime(&tt); sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response), " %04d-%02d-%02d %02d:%02d:%02d\r\nM %s COMPLD", ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, test_msg.CorrelationTag); getTL1response(test_msg.TestResult, cs_ptr->TL1response); so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response)); } break; case MEAS_VG_DC: case MEAS_VG_AC: case MEAS_LOOP_CUREST: case MEAS_LOOP_RES: case MEAS_RES: case MEAS_CAPNC: case MEAS_IMPED: case MEAS_NSE: if (test_msg.Error[0] != '\0') { buf[0] = 'S'; strncpy(&buf[1], test_msg.Error, 3); buf[4] = '\0'; for (i = 0; i < NUMBER_ERROR_CODES; i++) { if (strcmp(buf, ErrorCodeDefinitions[i]) == 0) break; } if (i < NUMBER_ERROR_CODES) deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, SERR(i)); else { /*can't access the cause of line error */ deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, S305); } so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response)); } else { time(&tt); ptm = localtime(&tt); vercode_str[0] = '\0'; if (test_msg.TestResult.OutResult[0] != 0) { ver_code = get_vercode_from_result(test_msg.TestResult.OutResult, vername); if (ver_code != -1) sprintf(vercode_str, "%s,\r\nORST=%s,\r\n", vername, test_msg.TestResult.OutResult); } switch (test_msg.CommandType) { case MEAS_VG_DC: sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response), " %04d-%02d-%02d %02d:%02d:%02d\r\nM %s COMPLD\r\n%s TG=%s,RG=%s,RT=%8.3f\r\n%s\r\n;", ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, test_msg.CorrelationTag, vercode_str, test_msg.TestResult.TG2_DCvol, test_msg.TestResult.RG2_DCvol, atof(test_msg.TestResult.TG2_DCvol) - atof(test_msg.TestResult.RG2_DCvol), test_msg.TestResult.TestConclusion); break; case MEAS_VG_AC: sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response), " %04d-%02d-%02d %02d:%02d:%02d\r\nM %s COMPLD\r\n%s TG=%s,RG=%s,RT=%8.3f\r\n%s\r\n;", ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, test_msg.CorrelationTag, vercode_str, test_msg.TestResult.TG_ACvol, test_msg.TestResult.RG_ACvol, atof(test_msg.TestResult.TG_ACvol) - atof(test_msg.TestResult.RG_ACvol), test_msg.TestResult.TestConclusion); break; case MEAS_LOOP_CUREST: sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response), " %04d-%02d-%02d %02d:%02d:%02d\r\nM %s COMPLD\r\n%s lcr=%s\r\n%s\r\n;", ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, test_msg.CorrelationTag, vercode_str, test_msg.TestResult.LoopCur, test_msg.TestResult.TestConclusion); break; case MEAS_LOOP_RES: sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response), " %04d-%02d-%02d %02d:%02d:%02d\r\nM %s COMPLD\r\n%s lr=%s\r\n%s\r\n;", ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -