Ejemplo n.º 1
0
Archivo: ads.c Proyecto: gass/libads
/**
 * \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));
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
Archivo: ads.c Proyecto: gass/libads
/**
 * 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));

}
Ejemplo n.º 4
0
Archivo: ads.c Proyecto: gass/libads
/**
 * 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));
}
Ejemplo n.º 5
0
Archivo: ads.c Proyecto: gass/libads
/**
 * 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));
}
Ejemplo n.º 6
0
Archivo: ads.c Proyecto: gass/libads
/**
 * 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));
}
Ejemplo n.º 7
0
Archivo: ads.c Proyecto: gass/libads
/**
 * 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));
}