/** * \brief Builds the necessary headers and analises the ADSserver ADSstate response * This is an interface to AdsAPI.c. * Used by AdsSyncReadStateReq(). * \param dc ADSConection handler * \param ADSstate Address of a variable that will receive the ADS status (see data type ADSSTATE). * \param devState Address of a variable that will receive the device status. * \return Error code */ int ADSreadState(ADSConnection * dc, unsigned short *ADSstate, unsigned short *devState) { AMSheader *h1; // AMS_TCPheader *h2; not used ADSpacket *p1; ADSpacket *p2; ADSstateResponse *StateResponse; int rc; int nErr; MsgOut(MSG_TRACE, "ADSreadState() called\n"); p1 = (ADSpacket *) dc->msgOut; h1 = &(p1->amsHeader); // h2 = &(p1->adsHeader); not used _ADSsetupAmsHeader(dc, h1); h1->commandId = cmdADSreadState; h1->dataLength = 0; p1->adsHeader.length = sizeof(AMSheader) + h1->dataLength; p1->adsHeader.reserved = 0; MsgAnalyzePacket("ADSreadState()", p1); /* sends the the packet */ rc = _ADSWritePacket(dc->iface, p1, &nErr); if(rc <= 0){ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadState() failed()."); #endif MsgOut(MSG_ERROR, "ADSreadState failed().\n"); return( _ADStranslateWrError(rc, nErr)); } /*Read the answer */ dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn, &nErr); MsgDumpPacket("ADSreadState()", dc->msgIn, dc->AnswLen); MsgAnalyzePacket("ADSreadState()", (ADSpacket*)dc->msgIn); if (dc->AnswLen > 0 && nErr == 0 ) { p2 = (ADSpacket *) dc->msgIn; if (p2->amsHeader.commandId == cmdADSreadState) { MsgAnalyzePacket("ADSreadState()", p2); StateResponse = (ADSstateResponse *) (dc->msgIn + 38); *ADSstate = StateResponse->ADSstate;; *devState = StateResponse->devState; MsgOut(MSG_TRACE, MsgStr("ADSreadState() returns 0x%x (0 means OK)\n", StateResponse->result)); return StateResponse->result; } else return p2->amsHeader.errorCode; } /* if there is an error */ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadState failed()."); #endif MsgOut(MSG_ERROR, "ADSreadState failed().\n"); return(_ADStranslateRdError(dc->AnswLen, nErr)); }
void *portServer(void *arg) { int *fd = (int *)arg; ads_debug(ADSDebug, "portMy fd is:%d\n", fd); int waitCount = 0; int pcount = 0; _ADSOSserialType s; s.rfd = *fd; s.wfd = *fd; ADSInterface *di = ADSNewInterface(s, me, 0x800, "IF"); di->timeout = 900000; ADSConnection *dc = ADSNewConnection(di, partner, 800); while (waitCount < 1000) { dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn); if (dc->AnswLen > 0) { ads_debug(ADSDebug, "%d ", pcount); _ADSDump("packet", dc->msgIn, dc->AnswLen); waitCount = 0; ranalyze(dc); pcount++; } else { waitCount++; } } ads_debug(ADSDebug, "portserver: I closed my fd.\n"); ; return NULL; }
/** * This is an interface to AdsAPI.c. * Used by ADSreadDeviceInfo(). */ int ADSreadDeviceInfo(ADSConnection * dc, char *pDevName, PAdsVersion pVersion) { AMSheader *h1; // AMS_TCPheader *h2; not used ADSpacket *p1; ADSpacket *p2; ADSdeviceInfo *DeviceInfo; int rc; int nErr; MsgOut(MSG_TRACE, "ADSreadDeviceInfo() called\n"); p1 = (ADSpacket *) dc->msgOut; h1 = &(p1->amsHeader); // h2 = &(p1->adsHeader); not used _ADSsetupAmsHeader(dc, h1); h1->commandId = cmdADSreadDevInfo; h1->dataLength = 0; p1->adsHeader.length = sizeof(AMSheader) + h1->dataLength; p1->adsHeader.reserved = 0; MsgAnalyzePacket("ADSreadDeviceInfo()", p1); rc = _ADSWritePacket(dc->iface, p1, &nErr); if(rc <= 0){ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadDeviceInfo() failed()."); #endif MsgOut(MSG_ERROR, "ADSreadDeviceInfo() failed().\n"); return( _ADStranslateWrError(rc, nErr)); } /*Reads the answer */ dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn, &nErr); if (dc->AnswLen > 0 && nErr == 0 ) { p2 = (ADSpacket *) dc->msgIn; if (p2->amsHeader.commandId == cmdADSreadDevInfo) { MsgAnalyzePacket("ADSreadDeviceInfo()", (ADSpacket*)dc->msgIn); DeviceInfo = (ADSdeviceInfo *) (dc->msgIn + 38); *pVersion = DeviceInfo->Version; memcpy(pDevName, DeviceInfo->name, 16); MsgOut(MSG_TRACE, MsgStr("ADSreadDeviceInfo() returns 0x%x (0 means OK)\n", DeviceInfo->result)); return DeviceInfo->result; } else return p2->amsHeader.errorCode; } /* if there is an error */ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadDeviceInfo() failed()."); #endif MsgOut(MSG_ERROR, "ADSreadDeviceInfo() failed().\n"); return(_ADStranslateRdError(dc->AnswLen, nErr)); }
/** * This is an interface to AdsAPI.c. * Used by AdsSyncReadStateReq(). */ int ADSwriteControl(ADSConnection *dc, int ADSstate, int devState, void *data, int length) { AMSheader *h1; // AMS_TCPheader *h2; not used ADSpacket *p1; ADSpacket *p2; ADSwriteControlRequest *rq; ADSwriteResponse *wr; int rc; int nErr; MsgOut(MSG_TRACE, "ADSwriteControl() called\n"); p1 = (ADSpacket *) dc->msgOut; h1 = &(p1->amsHeader); // h2 = &(p1->adsHeader); not used _ADSsetupAmsHeader(dc, h1); h1->commandId = cmdADSwriteControl; h1->dataLength = sizeof(ADSwriteControlRequest); p1->adsHeader.length = sizeof(AMSheader) + h1->dataLength; p1->adsHeader.reserved = 0; rq = (ADSwriteControlRequest *) & p1->data; rq->ADSstate = ADSstate; rq->devState = devState; rq->length = 0; if (data != NULL) { memcpy(rq->data, data, length); rq->length = length; h1->dataLength += length; } MsgAnalyzePacket("ADSwriteControl()", p1); rc = _ADSWritePacket(dc->iface, p1, &nErr); if(rc <= 0){ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSwriteControl() failed()."); #endif MsgOut(MSG_ERROR, "ADSwriteControl() failed().\n"); return( _ADStranslateWrError(rc, nErr)); } dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn, &nErr); p2 = (ADSpacket *) dc->msgIn; if (dc->AnswLen > 0 && nErr == 0 ) { MsgAnalyzePacket("ADSwriteControl()", p2); wr = (ADSwriteResponse *) (dc->msgIn + 38); MsgOut(MSG_TRACE, MsgStr("ADSwriteControl() returns 0x%x (0 means OK)\n", wr->result)); return wr->result; } else{ return p2->amsHeader.errorCode; } /* if there is an error */ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSwriteControl() failed()."); #endif MsgOut(MSG_ERROR, "ADSwriteControl() failed().\n"); return(_ADStranslateRdError(dc->AnswLen, nErr)); }
/** * This is an interface to AdsAPI.c. * Used by AdsSyncReadWriteReqEx(). */ int ADSreadWriteBytes(ADSConnection * dc, uint32_t indexGroup, uint32_t offset, uint32_t readLength, void *readBuffer, uint32_t writeLength, void *writeBuffer, uint32_t* pnRead) { AMSheader *h1; AMS_TCPheader *h2; ADSreadWriteRequest *rq; ADSreadWriteResponse *rr; int rc; int nErr; ADSpacket *p1 = (ADSpacket *) dc->msgOut; ADSpacket *p2; MsgOut(MSG_TRACE, "ADSreadWriteBytes() called\n"); h1 = &(p1->amsHeader); h2 = &(p1->adsHeader); _ADSsetupAmsHeader(dc, h1); h1->commandId = cmdADSreadWrite; h1->dataLength = sizeof(ADSreadWriteRequest) - MAXDATALEN + writeLength; h2->length = h1->dataLength + sizeof(AMSheader); h2->reserved = 0; rq = (ADSreadWriteRequest *) & p1->data; rq->indexGroup = indexGroup; rq->indexOffset = offset; rq->writeLength = writeLength; rq->readLength = readLength; if (writeBuffer != NULL) { memcpy(rq->data, writeBuffer, writeLength); } MsgOut(MSG_PACKET_V, MsgStr("Index Group: 0x%x\n", rq->indexGroup)); MsgOut(MSG_PACKET_V, MsgStr("Index Offset: %d\n", rq->indexOffset)); MsgOut(MSG_PACKET_V, MsgStr("Data length: %d\n", rq->writeLength)); MsgAnalyzePacket("ADSreadWriteBytes()", p1); rc = _ADSWritePacket(dc->iface, p1, &nErr); if(rc <= 0){ MsgOut(MSG_ERROR, "ADSreadWriteBytes() failed().\n"); return( _ADStranslateWrError(rc, nErr)); } /*Reads the answer */ dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn, &nErr); if (dc->AnswLen > 0 && nErr == 0 ) { p2 = (ADSpacket *) dc->msgIn; if (p2->amsHeader.commandId == cmdADSreadWrite) { MsgAnalyzePacket("ADSreadWriteBytes()", p2); rr = (ADSreadWriteResponse *) (dc->msgIn + 38); if(rr->length > readLength){ char strBuf[256]; sprintf(strBuf, "ADSreadWriteBytes() failed(): Max Read: %lu, got %u", readLength, rr->length); return(0x705); // parameter size not correct } // memcpy(readBuffer, rr->data, readLength); memcpy(readBuffer, rr->data, rr->length); if(pnRead != NULL) *pnRead = rr->length; MsgOut(MSG_TRACE, MsgStr("ADSreadBytes() returns 0x%x (0 means OK)\n", rr->result)); return rr->result; } else return p2->amsHeader.errorCode; } /* if there is an error */ MsgOut(MSG_ERROR, "ADSreadWriteBytes() failed().\n"); return(_ADStranslateRdError(dc->AnswLen, nErr)); }
/** * This is an interface to AdsAPI.c. * Used by AdsSyncWriteReq(). */ int ADSwriteBytes(ADSConnection *dc, int indexGroup, int offset, int length, void *data) { ADSpacket *p1; ADSpacket *p2; AMSheader *h1; // AMS_TCPheader *h2; not used ADSwriteRequest *rq; ADSwriteResponse *wr; int rc; int nErr; MsgOut(MSG_TRACE, "ADSwriteBytes() called\n"); p1 = (ADSpacket *) dc->msgOut; h1 = &(p1->amsHeader); // h2 = &(p1->adsHeader); not used _ADSsetupAmsHeader(dc, h1); h1->commandId = cmdADSwrite; h1->dataLength = sizeof(ADSwriteRequest) - MAXDATALEN + length; p1->adsHeader.length = sizeof(AMSheader) + h1->dataLength; p1->adsHeader.reserved = 0; rq = (ADSwriteRequest *) & p1->data; rq->indexGroup = indexGroup; rq->indexOffset = offset; rq->length = length; if (data != NULL) memcpy(rq->data, data, length); MsgOut(MSG_PACKET_V, MsgStr("Index Group: %x\n", rq->indexGroup)); MsgOut(MSG_PACKET_V, MsgStr("Index Offset: %d\n", rq->indexOffset)); MsgOut(MSG_PACKET_V, MsgStr("Data length: %d\n", rq->length)); MsgAnalyzePacket("ADSwriteBytes()", p1); rc = _ADSWritePacket(dc->iface, p1, &nErr); if(rc <= 0){ MsgOut(MSG_ERROR, "ADSwriteBytes() failed().\n"); return( _ADStranslateWrError(rc, nErr)); } /*Reads the answer */ dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn, &nErr); if (dc->AnswLen >= (sizeof(AMS_TCPheader) + sizeof(AMSheader))) { p2 = (ADSpacket *) dc->msgIn; if(nErr == 0 ) { MsgAnalyzePacket("ADSwriteBytes()", (ADSpacket*)dc->msgIn); wr = (ADSwriteResponse *) (dc->msgIn + 38); MsgOut(MSG_TRACE, MsgStr("ADSwriteBytes() returns 0x%x (0 means OK)\n", wr->result)); return wr->result; } else return p2->amsHeader.errorCode; } /* if there is an error */ MsgOut(MSG_ERROR, "ADSwriteBytes() failed().\n"); return(_ADStranslateRdError(dc->AnswLen, nErr)); }
/** * This is an interface to AdsAPI.c. * Used by AdsSyncReadReqEx() */ int ADSreadBytes(ADSConnection *dc, uint32_t indexGroup, uint32_t offset, uint32_t length, void *buffer, uint32_t *pnRead) { AMSheader *h1; // AMS_TCPheader *h2; not used ADSpacket *p1; ADSpacket *p2; ADSreadRequest *rq; ADSreadResponse *rr; int rc; int nErr; MsgOut(MSG_TRACE, "ADSreadBytes() called\n"); p1 = (ADSpacket *) dc->msgOut; h1 = &(p1->amsHeader); // h2 = &(p1->adsHeader); not used _ADSsetupAmsHeader(dc, h1); h1->commandId = cmdADSread; h1->dataLength = sizeof(ADSreadRequest); p1->adsHeader.length = sizeof(AMSheader) + h1->dataLength; p1->adsHeader.reserved = 0; rq = (ADSreadRequest *) &p1->data; rq->indexGroup = indexGroup; rq->indexOffset = offset; rq->length = length; MsgOut(MSG_PACKET_V, MsgStr("Index Group: 0x%x\n", rq->indexGroup)); MsgOut(MSG_PACKET_V, MsgStr("Index Offset: %d\n", rq->indexOffset)); MsgOut(MSG_PACKET_V, MsgStr("Data length: %d\n", rq->length)); MsgAnalyzePacket("ADSreadBytes", p1); rc = _ADSWritePacket(dc->iface, p1, &nErr); if(rc <= 0){ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadBytes() failed()."); #endif MsgOut(MSG_ERROR, "ADSreadBytes() failed().\n"); return( _ADStranslateWrError(rc, nErr)); } dc->AnswLen = _ADSReadPacket(dc->iface, dc->msgIn, &nErr); if (dc->AnswLen > 0 && nErr == 0 ) { p2 = (ADSpacket *) dc->msgIn; // if (p2->amsHeader.commandId == cmdADSread && p2->amsHeader.errorCode == 0) { if (p2->amsHeader.commandId == cmdADSread) { MsgDumpPacket("ADSreadBytes", dc->msgIn, dc->AnswLen); MsgAnalyzePacket("ADSreadBytes", (ADSpacket *)dc->msgIn); rr = (ADSreadResponse *) (dc->msgIn + 38); /* if (rr->result != 0){ #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadBytes(): ADSreadResponse() failed with error 0x%x.", rr->result); #endif MsgOut(MSG_ERROR, MsgStr("ADSreadBytes(): ADSreadResponse() failed with error 0x%x.\n", rr->result)); return rr->result; }*/ dc->dataPointer = dc->msgIn + 46; dc->AnswLen = rr->length; if (buffer != NULL) { if(rr->length > length){ char strBuf[256]; sprintf(strBuf, "ADSreadBytes() failed(): Buffer sized %lu bytes, got %u bytes.", length, rr->length); #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, strBuf); #endif MsgOut(MSG_ERROR, MsgStr("%s\n", strBuf)); return(0x705); // parameter size not correct } memcpy(buffer, dc->dataPointer, rr->length); } if(pnRead != NULL) *pnRead = rr->length; MsgOut(MSG_DEVEL, MsgStr("ADSreadBytes() invokeId=%d\n", p2->amsHeader.invokeId)); MsgOut(MSG_TRACE, "ADSreadBytes() returns 0 (OK)\n"); // return 0; // printf("rr->result=0x%x, p2->amsHeader.errorCode=0x%x\n", rr->result, p2->amsHeader.errorCode); return rr->result; } else return p2->amsHeader.errorCode; } #ifdef LOG_ALL_MESSAGES syslog(LOG_USER | LOG_ERR, "ADSreadBytes() failed()."); #endif MsgOut(MSG_ERROR, "ADSreadBytes() failed().\n"); return(_ADStranslateRdError(dc->AnswLen, nErr)); }