Work on now deprecated module AQH_Serial.
This commit is contained in:
@@ -82,15 +82,24 @@ uint8_t AQH_Serial_GetAddress(const AQH_SERIAL *sr)
|
||||
|
||||
|
||||
|
||||
int AQH_Serial_Open(AQH_SERIAL *sr)
|
||||
int AQH_Serial_Open(AQH_SERIAL *sr, int rwMode)
|
||||
{
|
||||
int fd;
|
||||
int status;
|
||||
int i;
|
||||
struct termios options;
|
||||
int rv;
|
||||
int m;
|
||||
|
||||
fd=open(sr->deviceName,O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
m=O_NOCTTY | O_NDELAY;
|
||||
switch(rwMode) {
|
||||
case AQH_SerialReadWriteMode_ReadOnly: m|=O_RDONLY; break;
|
||||
case AQH_SerialReadWriteMode_WriteOnly: m|=O_WRONLY; break;
|
||||
case AQH_SerialReadWriteMode_ReadWrite: m|=O_RDWR; break;
|
||||
default: m|=O_RDONLY; break;
|
||||
}
|
||||
|
||||
fd=open(sr->deviceName, m);
|
||||
if (fd<0) {
|
||||
DBG_ERROR(NULL, "Error on open(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||
return GWEN_ERROR_IO;
|
||||
@@ -323,7 +332,7 @@ int _attnLow(AQH_SERIAL *sr)
|
||||
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
status |= TIOCM_DTR; /* clear the DTR pin (cave: signals inverted!) */
|
||||
status |= TIOCM_DTR | TIOCM_RTS; /* clear the DTR pin (cave: signals inverted!) */
|
||||
rv=ioctl(sr->fd, TIOCMSET, &status);
|
||||
if (rv<0) {
|
||||
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||
@@ -346,7 +355,7 @@ int _attnHigh(AQH_SERIAL *sr)
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
status |= TIOCM_DTR; /* Set the DTR pin */
|
||||
status &= ~ TIOCM_DTR; /* clear the DTR pin (cave: signals inverted!) */
|
||||
status &= ~ (TIOCM_DTR | TIOCM_RTS); /* clear the DTR pin (cave: signals inverted!) */
|
||||
rv=ioctl(sr->fd, TIOCMSET, &status);
|
||||
if (rv<0) {
|
||||
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||
@@ -359,6 +368,22 @@ int _attnHigh(AQH_SERIAL *sr)
|
||||
|
||||
|
||||
|
||||
int _isAttnLow(AQH_SERIAL *sr)
|
||||
{
|
||||
int status;
|
||||
int rv;
|
||||
|
||||
rv=ioctl(sr->fd, TIOCMGET, &status);
|
||||
if (rv<0) {
|
||||
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
//return (status & TIOCM_CTS)?1:0;
|
||||
return (status & TIOCM_CTS)?1:0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int _readForced(AQH_SERIAL *sr, uint8_t *buf, int len)
|
||||
{
|
||||
while(len>0) {
|
||||
@@ -494,6 +519,11 @@ int _writeToFd(AQH_SERIAL *sr)
|
||||
int remaining;
|
||||
int rv;
|
||||
|
||||
if (_isAttnLow(sr)) {
|
||||
DBG_ERROR(NULL, "ATTN is low, not sending");
|
||||
usleep(100);
|
||||
return 0;
|
||||
}
|
||||
pos=AQH_Msg_GetCurrentPos(msg);
|
||||
remaining=AQH_Msg_GetRemainingBytes(msg);
|
||||
if (remaining>0) {
|
||||
@@ -635,6 +665,52 @@ int AQH_Serial_Loop(AQH_SERIAL *sr)
|
||||
|
||||
|
||||
|
||||
int AQH_Serial_ReadOnlyLoop(AQH_SERIAL *sr)
|
||||
{
|
||||
fd_set readSet;
|
||||
struct timeval tv;
|
||||
int rv;
|
||||
|
||||
tv.tv_sec=2;
|
||||
tv.tv_usec=0;
|
||||
|
||||
FD_ZERO(&readSet);
|
||||
FD_SET(sr->fd, &readSet);
|
||||
|
||||
rv=select(sr->fd+1, &readSet, NULL, NULL, &tv);
|
||||
if (rv<0) {
|
||||
if (errno!=EINTR) {
|
||||
DBG_ERROR(NULL, "Error on select");
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
}
|
||||
else if (rv) {
|
||||
if (FD_ISSET(sr->fd, &readSet)) {
|
||||
rv=_readFromFd(sr);
|
||||
if (rv<0) {
|
||||
DBG_ERROR(NULL, "here (%d)", rv);
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rv==0) {
|
||||
/* timeout */
|
||||
if (sr->currentlyReceivedMsg) {
|
||||
AQH_Msg_free(sr->currentlyReceivedMsg);
|
||||
sr->currentlyReceivedMsg=NULL;
|
||||
rv=_discardInput(sr);
|
||||
if (rv<0) {
|
||||
DBG_ERROR(NULL, "here (%d)", rv);
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,13 @@ typedef struct AQH_SERIAL AQH_SERIAL;
|
||||
typedef void (*AQH_SERIAL_PACKETRECEIVED_FN)(AQH_SERIAL *sr, AQH_MSG *msg);
|
||||
|
||||
|
||||
enum {
|
||||
AQH_SerialReadWriteMode_ReadOnly=1,
|
||||
AQH_SerialReadWriteMode_WriteOnly=2,
|
||||
AQH_SerialReadWriteMode_ReadWrite=3
|
||||
};
|
||||
|
||||
|
||||
|
||||
AQHOME_API AQH_SERIAL *AQH_Serial_new(const char *deviceName, uint8_t addr);
|
||||
AQHOME_API void AQH_Serial_free(AQH_SERIAL *sr);
|
||||
@@ -35,7 +42,7 @@ AQHOME_API void AQH_Serial_free(AQH_SERIAL *sr);
|
||||
AQHOME_API uint8_t AQH_Serial_GetAddress(const AQH_SERIAL *sr);
|
||||
|
||||
|
||||
AQHOME_API int AQH_Serial_Open(AQH_SERIAL *sr);
|
||||
AQHOME_API int AQH_Serial_Open(AQH_SERIAL *sr, int rwMode);
|
||||
AQHOME_API void AQH_Serial_Close(AQH_SERIAL *sr);
|
||||
|
||||
AQHOME_API int AQH_Serial_Recv(AQH_SERIAL *sr, uint8_t *buf, int len);
|
||||
@@ -45,6 +52,7 @@ AQHOME_API int AQH_Serial_SendPacket(AQH_SERIAL *sr, uint8_t destAddr, const uin
|
||||
|
||||
|
||||
AQHOME_API int AQH_Serial_Loop(AQH_SERIAL *sr);
|
||||
AQHOME_API int AQH_Serial_ReadOnlyLoop(AQH_SERIAL *sr);
|
||||
AQHOME_API int AQH_Serial_AddMessageToSend(AQH_SERIAL *sr, AQH_MSG *msg);
|
||||
|
||||
AQHOME_API int AQH_Serial_StartWriting(AQH_SERIAL *sr, const uint8_t *ptr, uint8_t len);
|
||||
|
||||
Reference in New Issue
Block a user