diff --git a/sps.c b/sps.c index 348ebc4..590fca0 100644 --- a/sps.c +++ b/sps.c @@ -12,13 +12,19 @@ Mark Koennnecke, Juli 1998 + Feature added: bipa command, Mark Koennecke, May 2009 + + Reworked to use rs232controller rather then the older serialport code + + Mark Koennecke, November 2009 + ---------------------------------------------------------------------------*/ #include #include #include #include -#include "fortify.h" -#include "hardsup/serialsinq.h" +#include "sics.h" +#include "rs232controller.h" #include "sics.h" #include "lld.h" #include "bit.h" @@ -47,24 +53,24 @@ static int init(pSPS self) assert(self); assert(self->pHost); - + prs232 rs232; + /* check if in simulation mode */ if (self->iMode) return 1; - /* open the port */ - iRet = - SerialOpen(&self->pData, self->pHost, self->iPort, self->iChannel); - if ((iRet != 1) || (self->pData == NULL)) { - self->iLastError = COMMDEAD; - return 0; + rs232 = createRS232(self->pHost,self->iPort); + self->pData = rs232; + iRet = initRS232(rs232); + if(iRet != 1){ + self->iLastError = COMMDEAD; + return 0; } - - /* configure terminators */ - SerialATerm(&self->pData, "1\r\n"); - SerialSendTerm(&self->pData, "\r\n"); - SerialConfig(&self->pData, 5000); - + setRS232SendTerminator(rs232,"\r\n"); + setRS232ReplyTerminator(rs232,"\n"); + setRS232Timeout(rs232,10000); + /* setRS232Debug(rs232,1); */ + return 1; } @@ -74,18 +80,26 @@ static int SPSCommand(pSPS self, char *pCommand, char *pReply, { int iRet, i; char pError[132]; - + prs232 rs232; + assert(self); assert(pCommand); assert(pReply); + rs232 = (prs232)self->pData; /* try at least three times to get the command through before giving up */ for (i = 0; i < 3; i++) { - iRet = SerialWriteRead(&self->pData, pCommand, pReply, iReplyLen); - if (iRet != 1) { + if(availableRS232(rs232)){ + memset(pReply,0, iReplyLen); + iRet = iReplyLen; + readRS232(rs232, pReply, &iRet); + /* printf("Dirt on the SPS cable: %d bytes, text = %s\n", iRet, pReply); */ + } + iRet = transactRS232(rs232, pCommand,strlen(pCommand), pReply, iReplyLen); + if (iRet < 0) { switch (iRet) { case TIMEOUT: self->iLastError = COMMTMO; @@ -93,10 +107,10 @@ static int SPSCommand(pSPS self, char *pCommand, char *pReply, break; default: self->iLastError = iRet; - SerialError(iRet, pError, 131); + getRS232Error(iRet,pError,131); WriteToCommandLog("SYS: SPS-TROUBLE:", pError); - SerialClose(&self->pData); - iRet = init(self); + closeRS232(rs232); + iRet = initRS232(rs232); if (iRet == 0) { return 0; } @@ -105,15 +119,6 @@ static int SPSCommand(pSPS self, char *pCommand, char *pReply, } } - /* now we may still have a TMO or OFL message */ - if (strstr(pReply, "?TMO") != NULL) { - self->iLastError = COMMTMO; - continue; - } - if (strstr(pReply, "?OFL") != NULL) { - self->iLastError = SPSOFFLINE; - return 0; - } return 1; } return 0; @@ -470,17 +475,24 @@ void SPSAddPermission(pSPS self, int iByte, int iBit, int iRights) void RemoveSPS(void *pData) { pSPS self = NULL; + prs232 rs232 = NULL; + self = (pSPS) pData; if (!self) return; + rs232 = (prs232)self->pData; if (self->pHost) { free(self->pHost); } - SerialClose(&self->pData); + if(rs232 != NULL){ + closeRS232(rs232); + KillRS232(rs232); + } + if (self->pDes) { DeleteDescriptor(self->pDes); } @@ -538,7 +550,7 @@ int SPSFactory(SConnection * pCon, SicsInterp * pSics, void *pData, /* get port number */ iRet = Tcl_GetInt(pSics->pTcl, argv[3], &iVal); if (iRet != TCL_OK) { - sprintf(pBueffel, + snprintf(pBueffel,255, "ERROR: expected integer argument for port, got %s", argv[3]); SCWrite(pCon, pBueffel, eError); @@ -550,7 +562,7 @@ int SPSFactory(SConnection * pCon, SicsInterp * pSics, void *pData, /* get channel number */ iRet = Tcl_GetInt(pSics->pTcl, argv[4], &iVal); if (iRet != TCL_OK) { - sprintf(pBueffel, + snprintf(pBueffel,255, "ERROR: expected integer argument for channel, got %s", argv[4]); SCWrite(pCon, pBueffel, eError); @@ -571,7 +583,7 @@ int SPSFactory(SConnection * pCon, SicsInterp * pSics, void *pData, /* install command */ iRet = AddCommand(pSics, argv[1], SPSAction, RemoveSPS, pNew); if (!iRet) { - sprintf(pBueffel, "ERROR: duplicate SPS command %s NOT created", + snprintf(pBueffel,255, "ERROR: duplicate SPS command %s NOT created", argv[1]); SCWrite(pCon, pBueffel, eError); RemoveSPS(pNew); @@ -594,7 +606,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, /* we need at least 3 arguments */ if (argc < 2) { - sprintf(pBueffel, "ERROR: need at least two arguments to %s", argv[0]); + snprintf(pBueffel,255, "ERROR: need at least two arguments to %s", argv[0]); SCWrite(pCon, pBueffel, eError); return 0; } @@ -604,7 +616,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, if (strcmp(argv[1], "push") == 0) { /* operate a button */ /* four arguments needed */ if (argc < 4) { - sprintf(pBueffel, "ERROR: need at least two arguments to %s push", + snprintf(pBueffel,255, "ERROR: need at least two arguments to %s push", argv[0]); SCWrite(pCon, pBueffel, eError); return 0; @@ -612,7 +624,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, /* convert arguments */ iRet = Tcl_GetInt(pSics->pTcl, argv[2], &iByte); if (iRet != TCL_OK) { - sprintf(pBueffel, + snprintf(pBueffel,255, "ERROR: expected integer argument for byte, got %s", argv[2]); SCWrite(pCon, pBueffel, eError); @@ -620,7 +632,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, } iRet = Tcl_GetInt(pSics->pTcl, argv[3], &iBit); if (iRet != TCL_OK) { - sprintf(pBueffel, "ERROR: expected integer argument for bit, got %s", + snprintf(pBueffel,255, "ERROR: expected integer argument for bit, got %s", argv[3]); SCWrite(pCon, pBueffel, eError); return 0; @@ -637,21 +649,21 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, } else if (strcmp(argv[1], "status") == 0) { /* status bits */ /* which bit ? */ if (argc < 3) { - sprintf(pBueffel, "ERROR: need at least two arguments to %s push", + snprintf(pBueffel,255, "ERROR: need at least two arguments to %s push", argv[0]); SCWrite(pCon, pBueffel, eError); return 0; } iRet = Tcl_GetInt(pSics->pTcl, argv[2], &iByte); if (iRet != TCL_OK) { - sprintf(pBueffel, "ERROR: expected integer argument for bit, got %s", + snprintf(pBueffel, 255, "ERROR: expected integer argument for bit, got %s", argv[2]); SCWrite(pCon, pBueffel, eError); return 0; } iRet = SPSGetStatus(self, iByte, &iSet); if (iRet <= 0) { - sprintf(pBueffel, "ERROR: failed to read status bit %d", iByte); + snprintf(pBueffel,255, "ERROR: failed to read status bit %d", iByte); SCWrite(pCon, pBueffel, eError); return 0; } @@ -660,7 +672,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, return 1; } else if (strcmp(argv[1], "stat2") == 0) { /* status bits */ if (argc < 4) { - sprintf(pBueffel, "ERROR: need at least two arguments to %s stat2", + snprintf(pBueffel,255, "ERROR: need at least two arguments to %s stat2", argv[0]); SCWrite(pCon, pBueffel, eError); return 0; @@ -668,14 +680,14 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, /* which bit ? */ iRet = Tcl_GetInt(pSics->pTcl, argv[2], &iByte); if (iRet != TCL_OK) { - sprintf(pBueffel, "ERROR: expected integer argument for bit, got %s", + snprintf(pBueffel,255, "ERROR: expected integer argument for bit, got %s", argv[2]); SCWrite(pCon, pBueffel, eError); return 0; } iRet = Tcl_GetInt(pSics->pTcl, argv[3], &iBit); if (iRet != TCL_OK) { - sprintf(pBueffel, "ERROR: expected integer argument for bit, got %s", + snprintf(pBueffel, 255, "ERROR: expected integer argument for bit, got %s", argv[3]); SCWrite(pCon, pBueffel, eError); return 0; @@ -698,7 +710,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, /* which ADC ? */ iRet = Tcl_GetInt(pSics->pTcl, argv[2], &iByte); if (iRet != TCL_OK) { - sprintf(pBueffel, "ERROR: expected integer argument for ADC, got %s", + snprintf(pBueffel,255, "ERROR: expected integer argument for ADC, got %s", argv[2]); SCWrite(pCon, pBueffel, eError); return 0; @@ -723,7 +735,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, /* we need lots of parameters */ if (argc < 5) { - sprintf(pBueffel, "ERROR: need at least three arguments to %s perm", + snprintf(pBueffel,255, "ERROR: need at least three arguments to %s perm", argv[0]); SCWrite(pCon, pBueffel, eError); return 0; @@ -731,7 +743,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, /* convert arguments */ iRet = Tcl_GetInt(pSics->pTcl, argv[2], &iByte); if (iRet != TCL_OK) { - sprintf(pBueffel, + snprintf(pBueffel,255, "ERROR: expected integer argument for byte, got %s", argv[2]); SCWrite(pCon, pBueffel, eError); @@ -739,7 +751,7 @@ int SPSAction(SConnection * pCon, SicsInterp * pSics, void *pData, } iRet = Tcl_GetInt(pSics->pTcl, argv[3], &iBit); if (iRet != TCL_OK) { - sprintf(pBueffel, "ERROR: expected integer argument for bit, got %s", + snprintf(pBueffel,255, "ERROR: expected integer argument for bit, got %s", argv[3]); SCWrite(pCon, pBueffel, eError); return 0;