📄 test.c
字号:
Sw->V5 = 0;
break;
}
if (ExkPtr == ExkNum) {
ReturnCode = 9; // Manual exec
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
}
/* 7. 移机 */
if (Func == 7) {
GetPara(Para, "LL=", tmp, 30);
if (strlen(tmp) == 0) {
ReturnCode = 8;
Sw->Busy = 0;
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
GetPara(Para, "NEWTEL=", NewTel, TEL_LEN);
for (ExkPtr=0; ExkPtr<ExkNum; ExkPtr++)
if (strncmp(NewTel, Exk[ExkPtr].Exk, strlen(Exk[ExkPtr].Exk)) == 0) {
NewSw = Exk[ExkPtr].SwPtr;
Sw->NewSw = NewSw;
if (Sw != NewSw) { // Not same switch
if (NewSw->Busy == 1) { // New switch busy
if (NewSw->Step[NewSw->SP] >= 3000000 && NewSw->Step[NewSw->SP] < 3000020 ||
NewSw->Step[NewSw->SP] >= 9000000 && NewSw->Step[NewSw->SP] < 9000010)
ReturnCode = 4; // NECG30 or 5ESS login
else
ReturnCode = 5; // Switch busy
Sw->Busy = 0;
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
if (CAPINodeStatus(NewSw->TcpNodeName) != TCP_CONNECTED) {
ReturnCode = 4;
Sw->Busy = 0;
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
strcpy(NewSw->ReqSrc, ReqSrc);
strcpy(NewSw->TID, TID);
strcpy(NewSw->Tel, NewTel);
strcpy(NewSw->Para, Para);
strcpy(NewSw->NewSrv, Sw->NewSrv);
NewSw->Func = Func;
NewSw->Busy = 1;
NewSw->SP = 0;
NewSw->Step[0] = 0;
NewSw->NewSw = NULL;
// V5
if (strstr(Exk[ExkPtr].SwitchTypeStr, "V5"))
Sw->V5 = 1;
else
Sw->V5 = 0;
}
break;
}
if (ExkPtr == ExkNum) {
Sw->Busy = 0;
ReturnCode = 9; // Manual exec
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
}
/* 实装统计 */
if (Func == 200) {
GetPara(Para, "EXK=", Tel, 8);
for (ExkPtr=0; ExkPtr<ExkNum; ExkPtr++) {
if (strcmp(Exk[ExkPtr].Exk, Tel) == 0) {
Sw = Exk[ExkPtr].SwPtr;
if (Sw->Busy == 1) {
if (Sw->Step[Sw->SP] >= 3000000 && Sw->Step[Sw->SP] < 3000020 ||
Sw->Step[Sw->SP] >= 9000000 && Sw->Step[Sw->SP] < 9000010)
ReturnCode = 4; // NECG30 or 5ESS login
else
ReturnCode = 5; // Switch busy
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
strcpy(Sw->ReqSrc, ReqSrc);
strcpy(Sw->TID, TID);
strcpy(Sw->Tel, "");
strcpy(Sw->Para, "");
Sw->InstLine = 0;
Sw->ExkPtr = 0;
Sw->Func = Func;
Sw->Busy = 1;
Sw->SP = 0;
Sw->Step[0] = Sw->SwitchType * 1000000 + Func * 1000;
break;
}
}
if (ExkPtr == ExkNum) {
ReturnCode = 9; // Manual exec
ReturnResult(ReqSrc, TID, ReturnCode, "");
return;
}
}
}
/*==========================================================
Function: Send2Switch
Note : Send command to switch
Para : None
Return : 1 - if succeed
0 - if failed
============================================================*/
int Send2Switch(void)
{
int sent;
sprintf(LogBuff, "Send2 %s: %s\n", Sw->Office, SndBuff);
LogInfo(LogBuff);
if (CAPINodeStatus(Sw->TcpNodeName) == TCP_CONNECTED) {
if (SendTcpPacket(SndBuff, Sw->TcpNodeName) == -1)
sent = 0;
else
sent = 1;
}
else
sent = 0;
if (sent == 0) {
sprintf(LogBuff, "Can not send to %s,%s : %s", Sw->Addr, Sw->Port, SndBuff);
LogErr(LogBuff);
return 0;
}
else
return 1;
}
/*==========================================================
Function: ReturnResult
Note :
Para : char *ReqSrc
char *TID
int ReturnCode
char *Para
Return : None
============================================================*/
void ReturnResult(char *ReqSrc, char *TID, int ReturnCode, char *Para)
{
sprintf(SndBuff, "%s %04d %s", TID, ReturnCode, Para);
sprintf(LogBuff, "Rtn : %s\n", SndBuff);
LogInfo(LogBuff);
if (SendTcpPacket(SndBuff, ReqSrc) == -1) {
sprintf(LogBuff, "Can not return to %s : %s", ReqSrc, SndBuff);
LogErr(LogBuff);
}
}
/*==========================================================
Function: LogErr
Note : Log error, "\n" has been added
Para : char *msg - Log message string
Return :
============================================================*/
void LogErr(char *msg)
{
FILE *fp;
struct tm date_time;
time_t time_c; /* typedef long time_t; */
time(&time_c);
memcpy(&date_time, localtime(&time_c), sizeof(date_time));
if ((fp=fopen(ErrLogFileName,"a"))==NULL) {
//perror("Error: Can not open error log file: ");
//printf("%s\n",ErrLogFileName);
return;
}
if (ftell(fp) >= 5L*1024L*1024L) { /* max log file size is 5M */
close(fp);
unlink(ErrLogFileName);
if ((fp=fopen(ErrLogFileName,"a"))==NULL) {
//perror("Error: Can not open error log file: ");
//printf("%s\n",ErrLogFileName);
return;
}
}
fprintf(fp, "%d-%02d-%02d %02d:%02d:%02d %s\n",
date_time.tm_year+1900, date_time.tm_mon+1, date_time.tm_mday,
date_time.tm_hour, date_time.tm_min, date_time.tm_sec, msg);
fclose(fp);
}
/*==========================================================
Function: LogWarn
Note : None
Para : None
Return :
============================================================*/
void LogWarn(void)
{
FILE *fp;
struct tm date_time;
time_t time_c; /* typedef long time_t; */
time(&time_c);
memcpy(&date_time, localtime(&time_c), sizeof(date_time));
if ((fp=fopen(WarnLogFileName,"a"))==NULL) {
//perror("Error: Can not open error log file: ");
//printf("%s\n",ErrLogFileName);
return;
}
if (ftell(fp) >= 5L*1024L*1024L) { /* max log file size is 5M */
close(fp);
unlink(WarnLogFileName);
if ((fp=fopen(WarnLogFileName,"a"))==NULL) {
//perror("Error: Can not open error log file: ");
//printf("%s\n",ErrLogFileName);
return;
}
}
if (Sw->Connect == 1)
strcpy(LogBuff, "接通");
else
strcpy(LogBuff, "*** 断开 ***");
fprintf(fp, "%d-%02d-%02d %02d:%02d:%02d %s %s\n",
date_time.tm_year+1900, date_time.tm_mon+1, date_time.tm_mday,
date_time.tm_hour, date_time.tm_min, date_time.tm_sec, Sw->Office, LogBuff);
fclose(fp);
}
/*======================================================
Function: LogInfo
Note : "\n" not added
Para : char *msg
Return : None
======================================================*/
void LogInfo(char *msg)
{
FILE *fp;
if (LOG != 1) return;
if ((fp=fopen(InfoLogFileName,"a"))==NULL) return;
if (ftell(fp)>=10L*1024L*1024L) { /* max log file size is 10M */
close(fp);
unlink(InfoLogFileName);
if ((fp=fopen(InfoLogFileName,"a"))==NULL) return;
}
fprintf(fp, "%s", msg); /* Output to file */
fclose(fp);
}
/*======================================================
Function: Quit
Note : deal with quit signal, exit program normally
Para : None
Return : int
======================================================*/
int Quit(void)
{
sprintf(LogBuff, "Program terminated. \n");
LogErr(LogBuff);
QUIT = 1;
}
/*========================================================
Function: strupr
Note : Convert string to upper case
Para : char *str - String
Return : String
=========================================================*/
char *strupr(char *str)
{
char *p;
for (p=str;*p!=0;p++) *p=toupper(*p);
return str;
}
/*=========================================================
Function: GetPara
Note : Get parameter from a string.
Para : char *src - The source string to be scanned
char *name - Parameter name (ex: "TEL=")
char *buff - The result buffer
int maxlen- if read chars more than maxlen, return ""
Return : if success, return 1
otherwise, return 0 & Null string
==========================================================*/
int GetPara(char *src, char *name, char *buff, int maxlen)
{
char *p, *dst;
int read_chars = 0;
p = strstr(src, name);
if (!p) { /* Not found */
buff[0] = '\0'; /* Return Null string */
return 0;
}
p += strlen(name); /* skip the name string */
while (*p == ' ') p++; /* skip the leading spaces */
for (dst=buff; *p!=' ' && *p!=';' && *p!=',' && *p!=0 && *p!=0x0d && *p!= 0x0a; p++,dst++) {
*dst = *p;
read_chars ++;
if (read_chars>maxlen) {
buff[0] = '\0';
return 0;
}
}
*dst = '\0'; /* End the buff */
return 1;
}
/*=================================================================
Function: timer
Note : Increase the timer variable by 1 in Exk array every 1 sec
Para : None
Return : None
==================================================================*/
void timer(void)
{
time_t cur_time, time_pass;
time(&cur_time);
time_pass = cur_time - systime;
if (time_pass==0) return;
systime = cur_time;
for (SwPtr=0; SwPtr<SwitchNum; SwPtr++)
Switch[SwPtr].timer += time_pass;
}
/*================================================================
Function: Go(int step)
Note :
Para : int step
Return : None
================================================================*/
void Go(int step)
{
Sw->Step[Sw->SP] = step;
Sw->timer = 0;
}
/*================================================================
Function: GoSub(int step)
Note :
Para : int step
Return : None
================================================================*/
void GoSub(int step)
{
Sw->Step[Sw->SP] ++;
Sw->SP ++;
Sw->Step[Sw->SP] = step;
}
/*================================================================
Function: Rtn
Note : Return from sub
Para : None
Return : None
================================================================*/
void Rtn(void)
{
Sw->SP --;
}
/*================================================================
Function: Send2Warn
Note : None
Para : None
Return : None
================================================================*/
void Send2Warn(void)
{
struct tm date_time;
time_t time_c; /* typedef long time_t; */
char date_str[32], msg[128];
time(&time_c);
memcpy(&date_time, localtime(&time_c), sizeof(date_time));
sprintf(date_str, "%d-%02d-%02d %02d:%02d:%02d",
date_time.tm_year+1900, date_time.tm_mon+1, date_time.tm_mday,
date_time.tm_hour, date_time.tm_min, date_time.tm_sec);
if (Sw->Connect == 1)
strcpy(msg, "接通");
else
strcpy(msg, "*** 断开 ***");
sprintf(SndBuff, "%s %s %s\r\n", date_str, Sw->Office, msg);
if (CAPINodeStatus(WarnHost) == TCP_CONNECTED)
SendTcpPacket(SndBuff, WarnHost);
}
/*==============================================================
Function: GetPacketNEC
Note : Judge NEC end-of-packet & get the error code
Para : None
Return : 1 - if reach packet end
0 - if not reach packet end
==============================================================*/
int GetPacketNEC(void)
{
char *p;
if (strstr(Sw->RcvBuff, "END\x0d") && strstr(Sw->RcvBuff, Sw->Tel)) {
Sw->ReturnCode = 0;
return 1;
}
if ( (p=strstr(Sw->RcvBuff, "ERR-")) && strlen(p) >= 8 ) {
p += 4; // Point to '0' of "ERR-011"
p[3] = '\0'; // set '\x0d' to 0
sscanf(p, "%d", &Sw->ReturnCode);
return 1;
}
return 0;
}
/*==============================================================
Function: GetNewSrvNEC
Note : Get and combine newsrv string
Para : None
Return : 1 - if success
0 - if fail, normal reason is error tel num
==============================================================*/
int GetNewSrvNEC(void)
{
char *p, buf[64];
int i;
p = strstr(Sw->RcvBuff, "EL=");
if (!p) return 0; // for judge err tel no in both version of nec
/* p="EL=00210001 101010 000 E " */
p += 32; // Point to 'E'
if (strcmp(Sw->SwitchTypeStr, "NECBF62") == 0) {
p = strstr(Sw->RcvBuff, " SC(");
if (!p) return 1; // No NewSrv
p += strlen(" SC(x) = ");
}
for (i=0; *p != ' '; i++,p++) buf[i] = *p;
buf[i] = '\0';
if (Sw->NewSrv[SPEED_CALL] == '-' && strchr(buf, 'B'))
Sw->NewSrv[SPEED_CALL] = '1';
if (Sw->NewSrv[HOT_LINE_A] == '-' && strchr(buf, 'C'))
Sw->NewSrv[HOT_LINE_A] = '1';
if (Sw->NewSrv[CALL_STORE_BUSY] == '-' && strchr(buf, 'D'))
Sw->NewSrv[CALL_STORE_BUSY] = '1';
if (Sw->NewSrv[CALL_RESTRICT] == '-' && strchr(buf, 'E'))
Sw->NewSrv[CALL_RESTRICT] = '1';
if (Sw->NewSrv[WAKE_UP] == '-' && strchr(buf, 'F'))
Sw->NewSrv[WAKE_UP] = '1';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -