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 fd;
|
||||||
int status;
|
int status;
|
||||||
int i;
|
int i;
|
||||||
struct termios options;
|
struct termios options;
|
||||||
int rv;
|
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) {
|
if (fd<0) {
|
||||||
DBG_ERROR(NULL, "Error on open(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
DBG_ERROR(NULL, "Error on open(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||||
return GWEN_ERROR_IO;
|
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);
|
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
||||||
return GWEN_ERROR_IO;
|
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);
|
rv=ioctl(sr->fd, TIOCMSET, &status);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
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;
|
return GWEN_ERROR_IO;
|
||||||
}
|
}
|
||||||
status |= TIOCM_DTR; /* Set the DTR pin */
|
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);
|
rv=ioctl(sr->fd, TIOCMSET, &status);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error on ioctl(%s): %s (%d)", sr->deviceName, strerror(errno), errno);
|
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)
|
int _readForced(AQH_SERIAL *sr, uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
while(len>0) {
|
while(len>0) {
|
||||||
@@ -494,6 +519,11 @@ int _writeToFd(AQH_SERIAL *sr)
|
|||||||
int remaining;
|
int remaining;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
if (_isAttnLow(sr)) {
|
||||||
|
DBG_ERROR(NULL, "ATTN is low, not sending");
|
||||||
|
usleep(100);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
pos=AQH_Msg_GetCurrentPos(msg);
|
pos=AQH_Msg_GetCurrentPos(msg);
|
||||||
remaining=AQH_Msg_GetRemainingBytes(msg);
|
remaining=AQH_Msg_GetRemainingBytes(msg);
|
||||||
if (remaining>0) {
|
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);
|
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 AQH_SERIAL *AQH_Serial_new(const char *deviceName, uint8_t addr);
|
||||||
AQHOME_API void AQH_Serial_free(AQH_SERIAL *sr);
|
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 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 void AQH_Serial_Close(AQH_SERIAL *sr);
|
||||||
|
|
||||||
AQHOME_API int AQH_Serial_Recv(AQH_SERIAL *sr, uint8_t *buf, int len);
|
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_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_AddMessageToSend(AQH_SERIAL *sr, AQH_MSG *msg);
|
||||||
|
|
||||||
AQHOME_API int AQH_Serial_StartWriting(AQH_SERIAL *sr, const uint8_t *ptr, uint8_t len);
|
AQHOME_API int AQH_Serial_StartWriting(AQH_SERIAL *sr, const uint8_t *ptr, uint8_t len);
|
||||||
|
|||||||
Reference in New Issue
Block a user