Improved ebus device handling to use tcp based device too
This commit is contained in:
@@ -3,6 +3,8 @@ ebus Daemon (ebusd) - ChangeLog
|
||||
|
||||
2014-02-20:
|
||||
* Missing void declarations in various function parameter added.
|
||||
* New branch "socket" created.
|
||||
* Improved ebus device handling to use tcp based device too.
|
||||
|
||||
2014-01-22:
|
||||
* autogen.sh modified.
|
||||
|
||||
+203
-150
@@ -40,6 +40,10 @@
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "ebus-decode.h"
|
||||
@@ -68,15 +72,14 @@ static unsigned char ack = EBUS_ACK;
|
||||
static unsigned char nak = EBUS_NAK;
|
||||
static unsigned char syn = EBUS_SYN;
|
||||
|
||||
static int sfd;
|
||||
static int bfd;
|
||||
static int devicetype = BUS_DEVICE_SERIAL;
|
||||
static struct termios oldtio;
|
||||
|
||||
static FILE *rawfp = NULL;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
eb_set_nodevicecheck(int check)
|
||||
{
|
||||
@@ -189,131 +192,6 @@ eb_raw_file_write(const unsigned char *buf, int buflen)
|
||||
|
||||
|
||||
|
||||
int
|
||||
eb_serial_valid(void)
|
||||
{
|
||||
int serial;
|
||||
|
||||
if (ioctl(sfd, TIOCMGET, &serial) < 0 && nodevicecheck == NO)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eb_serial_open(const char *dev, int *fd)
|
||||
{
|
||||
int ret;
|
||||
struct termios newtio;
|
||||
|
||||
sfd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
//~ err_ret_if(sfd < 0, -1);
|
||||
if (sfd < 0)
|
||||
return -1;
|
||||
|
||||
ret = fcntl(sfd, F_SETFL, 0);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
/* check if the usb device is working */
|
||||
ret = eb_serial_valid();
|
||||
err_ret_if(ret < 0, -2);
|
||||
|
||||
/* save current settings of serial port */
|
||||
ret = tcgetattr(sfd, &oldtio);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
memset(&newtio, '\0', sizeof(newtio));
|
||||
|
||||
newtio.c_cflag = SERIAL_BAUDRATE | CS8 | CLOCAL | CREAD;
|
||||
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
||||
newtio.c_iflag = IGNPAR;
|
||||
newtio.c_oflag &= ~OPOST;
|
||||
|
||||
newtio.c_cc[VMIN] = 1;
|
||||
newtio.c_cc[VTIME] = 0;
|
||||
|
||||
ret = tcflush(sfd, TCIFLUSH);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
/* activate new settings of serial port */
|
||||
ret = tcsetattr(sfd, TCSANOW, &newtio);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
*fd = sfd;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eb_serial_close(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* activate old settings of serial port */
|
||||
ret = tcsetattr(sfd, TCSANOW, &oldtio);
|
||||
/* Ignore this error otherwise USB port may stay unclosed */
|
||||
/* err_ret_if(ret < 0, -1); */
|
||||
|
||||
/* Close file descriptor from serial device */
|
||||
ret = close(sfd);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eb_serial_send(const unsigned char *buf, int buflen)
|
||||
{
|
||||
int ret, val;
|
||||
|
||||
/* write msg to ebus device */
|
||||
val = write(sfd, buf, buflen);
|
||||
err_ret_if(val < 0, -1);
|
||||
|
||||
ret = tcflush(sfd, TCIOFLUSH);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int
|
||||
eb_serial_recv(unsigned char *buf, int *buflen)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* flush deactivated - brings us an error */
|
||||
/* tcflush(sfd, TCIOFLUSH); */
|
||||
|
||||
/* read msg from ebus device */
|
||||
*buflen = read(sfd, buf, *buflen);
|
||||
err_if(*buflen < 0);
|
||||
|
||||
if (*buflen < 0) {
|
||||
log_print(L_WAR, "error read serial device");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*buflen > SERIAL_BUFSIZE) {
|
||||
log_print(L_WAR, "read data len > %d", SERIAL_BUFSIZE);
|
||||
return -3;
|
||||
}
|
||||
|
||||
/* print bus */
|
||||
if (showraw == YES)
|
||||
eb_print_hex(buf, *buflen);
|
||||
|
||||
/* dump raw data*/
|
||||
if (rawdump == YES) {
|
||||
ret = eb_raw_file_write(buf, *buflen);
|
||||
if (ret < 0)
|
||||
log_print(L_WAR, "can't write rawdata");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
eb_print_result(void)
|
||||
{
|
||||
@@ -364,7 +242,7 @@ eb_recv_data_get(unsigned char *buf, int *buflen)
|
||||
void
|
||||
eb_recv_data_prepare(const unsigned char *buf, int buflen)
|
||||
{
|
||||
unsigned char tmp[SERIAL_BUFSIZE];
|
||||
unsigned char tmp[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, crc;
|
||||
|
||||
memset(tmp, '\0', sizeof(tmp));
|
||||
@@ -407,7 +285,7 @@ eb_recv_data_prepare(const unsigned char *buf, int buflen)
|
||||
int
|
||||
eb_recv_data(unsigned char *buf, int *buflen)
|
||||
{
|
||||
unsigned char tmp[SERIAL_BUFSIZE], msg[SERIAL_BUFSIZE];
|
||||
unsigned char tmp[BUS_DEVICE_BUFSIZE], msg[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, msglen, ret, i, esc, found;
|
||||
|
||||
memset(msg, '\0', sizeof(msg));
|
||||
@@ -421,7 +299,7 @@ eb_recv_data(unsigned char *buf, int *buflen)
|
||||
memset(tmp, '\0', sizeof(tmp));
|
||||
tmplen = sizeof(tmp);
|
||||
|
||||
ret = eb_serial_recv(tmp, &tmplen);
|
||||
ret = eb_bus_recv(tmp, &tmplen);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -506,7 +384,7 @@ eb_recv_data(unsigned char *buf, int *buflen)
|
||||
int
|
||||
eb_bus_wait_syn(int *skip)
|
||||
{
|
||||
unsigned char buf[SERIAL_BUFSIZE];
|
||||
unsigned char buf[BUS_DEVICE_BUFSIZE];
|
||||
int buflen, ret, i, found;
|
||||
|
||||
found = 99;
|
||||
@@ -516,7 +394,7 @@ eb_bus_wait_syn(int *skip)
|
||||
memset(buf, '\0', sizeof(buf));
|
||||
buflen = sizeof(buf);
|
||||
|
||||
ret = eb_serial_recv(buf, &buflen);
|
||||
ret = eb_bus_recv(buf, &buflen);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -543,7 +421,7 @@ eb_bus_wait_syn(int *skip)
|
||||
int
|
||||
eb_bus_wait(void)
|
||||
{
|
||||
unsigned char buf[SERIAL_BUFSIZE];
|
||||
unsigned char buf[BUS_DEVICE_BUFSIZE];
|
||||
int buflen, ret, skip, retry;
|
||||
struct timeval tact, tlast, tdiff;
|
||||
|
||||
@@ -559,7 +437,7 @@ eb_bus_wait(void)
|
||||
gettimeofday(&tlast, NULL);
|
||||
|
||||
/* send QQ */
|
||||
ret = eb_serial_send(&qq, 1);
|
||||
ret = eb_bus_send(&qq, 1);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -576,7 +454,7 @@ eb_bus_wait(void)
|
||||
/* receive 1 byte - must be QQ */
|
||||
memset(buf, '\0', sizeof(buf));
|
||||
buflen = sizeof(buf);
|
||||
ret = eb_serial_recv(buf, &buflen);
|
||||
ret = eb_bus_recv(buf, &buflen);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -600,7 +478,7 @@ eb_bus_free(void)
|
||||
ret = 0;
|
||||
skip = 0;
|
||||
|
||||
ret = eb_serial_send(&syn, 1);
|
||||
ret = eb_bus_send(&syn, 1);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -611,12 +489,187 @@ eb_bus_free(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eb_bus_valid(void)
|
||||
{
|
||||
int busdevice;
|
||||
|
||||
if (ioctl(bfd, TIOCMGET, &busdevice) < 0 && nodevicecheck == NO)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
eb_bus_devicetype(const char *dev)
|
||||
{
|
||||
if (strchr(dev, '/') == NULL && strchr(dev, ':') != NULL) {
|
||||
|
||||
devicetype = BUS_DEVICE_SOCKET;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
eb_bus_open(const char *dev, int *fd)
|
||||
{
|
||||
int ret;
|
||||
|
||||
eb_bus_devicetype(dev);
|
||||
|
||||
if (devicetype == BUS_DEVICE_SERIAL) {
|
||||
struct termios newtio;
|
||||
|
||||
bfd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
//~ err_ret_if(bfd < 0, -1);
|
||||
if (bfd < 0)
|
||||
return -1;
|
||||
|
||||
ret = fcntl(bfd, F_SETFL, 0);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
/* check if the serial device is working */
|
||||
ret = eb_bus_valid();
|
||||
err_ret_if(ret < 0, -2);
|
||||
|
||||
/* save current settings of serial device */
|
||||
ret = tcgetattr(bfd, &oldtio);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
memset(&newtio, '\0', sizeof(newtio));
|
||||
|
||||
newtio.c_cflag = SERIAL_BAUDRATE | CS8 | CLOCAL | CREAD;
|
||||
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
||||
newtio.c_iflag = IGNPAR;
|
||||
newtio.c_oflag &= ~OPOST;
|
||||
|
||||
newtio.c_cc[VMIN] = 1;
|
||||
newtio.c_cc[VTIME] = 0;
|
||||
|
||||
ret = tcflush(bfd, TCIFLUSH);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
/* activate new settings of serial device */
|
||||
ret = tcsetattr(bfd, TCSANOW, &newtio);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
*fd = bfd;
|
||||
}
|
||||
|
||||
if (devicetype == BUS_DEVICE_SOCKET) {
|
||||
struct sockaddr_in sock;
|
||||
|
||||
memset((char *) &sock, 0, sizeof(sock));
|
||||
|
||||
char *host = strtok((char *) dev, ":");
|
||||
char *port = strtok(NULL, ":");
|
||||
|
||||
if (inet_addr(host) == INADDR_NONE) {
|
||||
struct hostent *he;
|
||||
|
||||
he = gethostbyname(host);
|
||||
err_ret_if(he == NULL, -1);
|
||||
|
||||
memcpy(&sock.sin_addr, he->h_addr_list[0], he->h_length);
|
||||
} else {
|
||||
ret = inet_aton(host, &sock.sin_addr);
|
||||
err_ret_if(ret == 0, -1);
|
||||
}
|
||||
|
||||
sock.sin_family = AF_INET;
|
||||
sock.sin_port = htons(atoi(port));
|
||||
|
||||
bfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
err_ret_if(bfd < 0, -1);
|
||||
|
||||
ret = connect(bfd, (struct sockaddr *)&sock, sizeof(sock));
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
*fd = bfd;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eb_bus_close(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (devicetype == BUS_DEVICE_SERIAL) {
|
||||
/* activate old settings of serial device */
|
||||
ret = tcsetattr(bfd, TCSANOW, &oldtio);
|
||||
/* Ignore this error otherwise USB port may stay unclosed */
|
||||
/* err_ret_if(ret < 0, -1); */
|
||||
}
|
||||
|
||||
/* Close file descriptor from bus device */
|
||||
ret = close(bfd);
|
||||
err_ret_if(ret < 0, -1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eb_bus_send(const unsigned char *buf, int buflen)
|
||||
{
|
||||
int ret, val;
|
||||
|
||||
/* write msg to bus device */
|
||||
val = write(bfd, buf, buflen);
|
||||
err_ret_if(val < 0, -1);
|
||||
|
||||
if (devicetype == BUS_DEVICE_SERIAL) {
|
||||
ret = tcflush(bfd, TCIOFLUSH);
|
||||
err_ret_if(ret < 0, -1);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int
|
||||
eb_bus_recv(unsigned char *buf, int *buflen)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* if (devicetype == BUS_DEVICE_SERIAL) { */
|
||||
/* flush deactivated - brings us an error */
|
||||
/* tcflush(bfd, TCIOFLUSH); */
|
||||
/* } */
|
||||
|
||||
/* read msg from bus device */
|
||||
*buflen = read(bfd, buf, *buflen);
|
||||
err_if(*buflen < 0);
|
||||
|
||||
if (*buflen < 0) {
|
||||
log_print(L_WAR, "error read bus device");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*buflen > BUS_DEVICE_BUFSIZE) {
|
||||
log_print(L_WAR, "read data len > %d", BUS_DEVICE_BUFSIZE);
|
||||
return -3;
|
||||
}
|
||||
|
||||
/* print bus */
|
||||
if (showraw == YES)
|
||||
eb_print_hex(buf, *buflen);
|
||||
|
||||
/* dump raw data*/
|
||||
if (rawdump == YES) {
|
||||
ret = eb_raw_file_write(buf, *buflen);
|
||||
if (ret < 0)
|
||||
log_print(L_WAR, "can't write rawdata");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
eb_send_data_get_ack(unsigned char *buf, int *buflen)
|
||||
{
|
||||
unsigned char tmp[SERIAL_BUFSIZE];
|
||||
unsigned char tmp[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, ret, i, j, found;
|
||||
|
||||
j = 0;
|
||||
@@ -627,7 +680,7 @@ eb_send_data_get_ack(unsigned char *buf, int *buflen)
|
||||
memset(tmp, '\0', sizeof(tmp));
|
||||
tmplen = sizeof(tmp);
|
||||
|
||||
ret = eb_serial_recv(tmp, &tmplen);
|
||||
ret = eb_bus_recv(tmp, &tmplen);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -679,7 +732,7 @@ eb_send_data_get_ack(unsigned char *buf, int *buflen)
|
||||
void
|
||||
eb_send_data_prepare(const unsigned char *buf, int buflen)
|
||||
{
|
||||
unsigned char crc[2], tmp[SERIAL_BUFSIZE];
|
||||
unsigned char crc[2], tmp[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, crclen;
|
||||
|
||||
/* reset struct */
|
||||
@@ -725,7 +778,7 @@ eb_send_data_prepare(const unsigned char *buf, int buflen)
|
||||
int
|
||||
eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus, int *buslen)
|
||||
{
|
||||
unsigned char tmp[SERIAL_BUFSIZE];
|
||||
unsigned char tmp[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, ret, val;
|
||||
|
||||
ret = 0;
|
||||
@@ -741,7 +794,7 @@ eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus,
|
||||
*buslen = send_data.len_esc;
|
||||
|
||||
/* send message to slave */
|
||||
ret = eb_serial_send(&send_data.msg_esc[1], send_data.len_esc - 1);
|
||||
ret = eb_bus_send(&send_data.msg_esc[1], send_data.len_esc - 1);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -780,7 +833,7 @@ eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus,
|
||||
*buslen += send_data.len_esc;
|
||||
|
||||
/* send message to slave */
|
||||
ret = eb_serial_send(&send_data.msg_esc[0], send_data.len_esc);
|
||||
ret = eb_bus_send(&send_data.msg_esc[0], send_data.len_esc);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -837,7 +890,7 @@ eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus,
|
||||
*buslen += 1;
|
||||
|
||||
/* send message to slave */
|
||||
ret = eb_serial_send(&nak, 1);
|
||||
ret = eb_bus_send(&nak, 1);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -874,7 +927,7 @@ eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus,
|
||||
memcpy(&bus[*buslen], &nak, 1);
|
||||
*buslen += 1;
|
||||
|
||||
ret = eb_serial_send(&nak, 1);
|
||||
ret = eb_bus_send(&nak, 1);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -884,7 +937,7 @@ eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus,
|
||||
memcpy(&bus[*buslen], &ack, 1);
|
||||
*buslen += 1;
|
||||
|
||||
ret = eb_serial_send(&ack, 1);
|
||||
ret = eb_bus_send(&ack, 1);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
@@ -904,7 +957,7 @@ eb_send_data(const unsigned char *buf, int buflen, int type, unsigned char *bus,
|
||||
void
|
||||
eb_execute(int id, char *data, char *buf, int *buflen)
|
||||
{
|
||||
unsigned char msg[SERIAL_BUFSIZE], hlp[CMD_DATA_SIZE], bus[TMP_BUFSIZE];
|
||||
unsigned char msg[BUS_DEVICE_BUFSIZE], hlp[CMD_DATA_SIZE], bus[TMP_BUFSIZE];
|
||||
char tmp[TMP_BUFSIZE];
|
||||
int ret, msglen, buslen, msgtype, retry, cycdata, pos, len;
|
||||
|
||||
@@ -1166,10 +1219,10 @@ eb_cyc_data_process(const unsigned char *buf, int buflen)
|
||||
int
|
||||
eb_cyc_data_recv(void)
|
||||
{
|
||||
static unsigned char msg[SERIAL_BUFSIZE];
|
||||
static unsigned char msg[BUS_DEVICE_BUFSIZE];
|
||||
static int msglen = 0;
|
||||
|
||||
unsigned char buf[SERIAL_BUFSIZE];
|
||||
unsigned char buf[BUS_DEVICE_BUFSIZE];
|
||||
int ret, i, buflen;
|
||||
|
||||
char tmp[TMP_BUFSIZE];
|
||||
@@ -1182,7 +1235,7 @@ eb_cyc_data_recv(void)
|
||||
memset(msg, '\0', sizeof(msg));
|
||||
|
||||
/* get new data */
|
||||
ret = eb_serial_recv(buf, &buflen);
|
||||
ret = eb_bus_recv(buf, &buflen);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
+47
-42
@@ -44,9 +44,9 @@
|
||||
*/
|
||||
struct send_data {
|
||||
unsigned char crc; /**< crc of escaped message */
|
||||
unsigned char msg[SERIAL_BUFSIZE + 1]; /**< original message */
|
||||
unsigned char msg[BUS_DEVICE_BUFSIZE + 1]; /**< original message */
|
||||
int len; /**< length of original message */
|
||||
unsigned char msg_esc[SERIAL_BUFSIZE + 1]; /**< esacaped message */
|
||||
unsigned char msg_esc[BUS_DEVICE_BUFSIZE + 1]; /**< esacaped message */
|
||||
int len_esc; /**< length of esacaped message */
|
||||
};
|
||||
|
||||
@@ -56,9 +56,9 @@ struct send_data {
|
||||
struct recv_data {
|
||||
unsigned char crc_recv; /**< received crc */
|
||||
unsigned char crc_calc; /**< calculated crc */
|
||||
unsigned char msg[SERIAL_BUFSIZE + 1]; /**< unescaped message */
|
||||
unsigned char msg[BUS_DEVICE_BUFSIZE + 1]; /**< unescaped message */
|
||||
int len; /**< length of unescaped message */
|
||||
unsigned char msg_esc[SERIAL_BUFSIZE + 1]; /**< received message */
|
||||
unsigned char msg_esc[BUS_DEVICE_BUFSIZE + 1]; /**< received message */
|
||||
int len_esc; /**< length of received message */
|
||||
};
|
||||
|
||||
@@ -165,44 +165,6 @@ int eb_raw_file_write(const unsigned char *buf, int buflen);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Check if serial FD is vaild.
|
||||
* @return 0 ok | -1 error
|
||||
*/
|
||||
int eb_serial_valid(void);
|
||||
|
||||
/**
|
||||
* @brief Open serial device in raw mode. 1 Byte is then minimum input length.
|
||||
* @param [in] *dev serial device
|
||||
* @param [out] *fd file descriptor from opened serial device
|
||||
* @return 0 ok | -1 error
|
||||
*/
|
||||
int eb_serial_open(const char *dev, int *fd);
|
||||
|
||||
/**
|
||||
* @brief close serial device and set settings to default.
|
||||
* @return 0 ok | -1 error | -2 bad file descriptor
|
||||
*/
|
||||
int eb_serial_close(void);
|
||||
|
||||
/**
|
||||
* @brief send bytes to serial device
|
||||
* @param [in] *buf pointer to a byte array
|
||||
* @param [in] buflen length of byte array
|
||||
* @return 0 ok | -1 error | -2 bad file descriptor
|
||||
*/
|
||||
int eb_serial_send(const unsigned char *buf, int buflen);
|
||||
|
||||
/**
|
||||
* @brief receive bytes from serial device
|
||||
* @param [out] *buf pointer to a byte array received bytes
|
||||
* @param [out] *buflen length of received bytes
|
||||
* @return 0 ok | -1 error | -2 bad file descriptor | -3 received data > BUFFER
|
||||
*/
|
||||
int eb_serial_recv(unsigned char *buf, int *buflen);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief print received results in a specific format
|
||||
* @return none
|
||||
@@ -267,6 +229,49 @@ int eb_bus_wait(void);
|
||||
*/
|
||||
int eb_bus_free(void);
|
||||
|
||||
/**
|
||||
* @brief check device type
|
||||
* @param [in] *dev bus device
|
||||
* @return none
|
||||
*/
|
||||
void eb_bus_devicetype(const char *dev);
|
||||
|
||||
/**
|
||||
* @brief Check if bus FD is vaild.
|
||||
* @return 0 ok | -1 error
|
||||
*/
|
||||
int eb_bus_valid(void);
|
||||
|
||||
/**
|
||||
* @brief Open bus device in raw mode. 1 Byte is then minimum input length.
|
||||
* @param [in] *dev bus device
|
||||
* @param [out] *fd file descriptor from opened bus device
|
||||
* @return 0 ok | -1 error
|
||||
*/
|
||||
int eb_bus_open(const char *dev, int *fd);
|
||||
|
||||
/**
|
||||
* @brief close bus device (and reset settings)
|
||||
* @return 0 ok | -1 error | -2 bad file descriptor
|
||||
*/
|
||||
int eb_bus_close(void);
|
||||
|
||||
/**
|
||||
* @brief send bytes to bus device
|
||||
* @param [in] *buf pointer to a byte array
|
||||
* @param [in] buflen length of byte array
|
||||
* @return 0 ok | -1 error | -2 bad file descriptor
|
||||
*/
|
||||
int eb_bus_send(const unsigned char *buf, int buflen);
|
||||
|
||||
/**
|
||||
* @brief receive bytes from bus device
|
||||
* @param [out] *buf pointer to a byte array received bytes
|
||||
* @param [out] *buflen length of received bytes
|
||||
* @return 0 ok | -1 error | -2 bad file descriptor | -3 received data > BUFFER
|
||||
*/
|
||||
int eb_bus_recv(unsigned char *buf, int *buflen);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -685,7 +685,7 @@ eb_cmd_prepare(int id, char *data, unsigned char *msg, int *msglen, char *buf)
|
||||
char str[CMD_SIZE_S_ZZ + CMD_SIZE_S_CMD + 2 + CMD_SIZE_S_MSG + 1];
|
||||
char byte;
|
||||
int ret, i, j, k;
|
||||
int in[SERIAL_BUFSIZE];
|
||||
int in[BUS_DEVICE_BUFSIZE];
|
||||
|
||||
/* encode msg */
|
||||
memset(tmp, '\0', sizeof(tmp));
|
||||
|
||||
+5
-1
@@ -58,9 +58,13 @@
|
||||
#define EBUS_MSG_MASTER_MAX_DB_LEN 12
|
||||
#define EBUS_MSG_SLAVE_MAX_DB_LEN 12
|
||||
|
||||
#define BUS_DEVICE_SERIAL 0
|
||||
#define BUS_DEVICE_SOCKET 1
|
||||
#define BUS_DEVICE_BUFSIZE 100
|
||||
|
||||
#define SERIAL_DEVICE "/dev/ttyUSB0"
|
||||
#define SERIAL_BAUDRATE B2400
|
||||
#define SERIAL_BUFSIZE 100
|
||||
|
||||
|
||||
#define CMD_DATA_SIZE 50 /* 5+16+3+16+2 = 42 || 256 */
|
||||
|
||||
|
||||
+2
-2
@@ -64,7 +64,7 @@ eb_htoi(const char *buf)
|
||||
void
|
||||
eb_esc(unsigned char *buf, int *buflen)
|
||||
{
|
||||
unsigned char tmp[SERIAL_BUFSIZE];
|
||||
unsigned char tmp[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, i;
|
||||
|
||||
memset(tmp, '\0', sizeof(tmp));
|
||||
@@ -101,7 +101,7 @@ eb_esc(unsigned char *buf, int *buflen)
|
||||
void
|
||||
eb_unesc(unsigned char *buf, int *buflen)
|
||||
{
|
||||
unsigned char tmp[SERIAL_BUFSIZE];
|
||||
unsigned char tmp[BUS_DEVICE_BUFSIZE];
|
||||
int tmplen, i, found;
|
||||
|
||||
memset(tmp, '\0', sizeof(tmp));
|
||||
|
||||
+23
-23
@@ -48,7 +48,7 @@ static int pidfile_locked = NO;
|
||||
static int msg_queue_on = NO;
|
||||
|
||||
static int pidfd = UNSET; /* pidfile file descriptor */
|
||||
static int serialfd = UNSET; /* serial file descriptor */
|
||||
static int busfd = UNSET; /* bus file descriptor */
|
||||
static int socketfd = UNSET; /* socket file descriptor */
|
||||
|
||||
|
||||
@@ -105,12 +105,12 @@ static struct config cfg[] = {
|
||||
{"address", STR, &address, "\tbus address (" NUMSTR(EBUS_QQ) ")"},
|
||||
{"cfgdir", STR, &cfgdir, "\tconfiguration directory of command files (" DAEMON_CFGDIR ")"},
|
||||
{"cfgfile", STR, &cfgfile, "\tdaemon configuration file (" DAEMON_CFGFILE ")"},
|
||||
{"device", STR, &device, "\tserial device (" SERIAL_DEVICE ")"},
|
||||
{"device", STR, &device, "\tbus device (" SERIAL_DEVICE ")"},
|
||||
{"extension", STR, &extension, "extension of command files (" DAEMON_EXTENSION ")"},
|
||||
{"foreground", BOL, &foreground, "run in foreground"},
|
||||
{"loglevel", STR, &loglevel, "\tlog level (INF | " LOGTXT ")"},
|
||||
{"logfile", STR, &logfile, "\tlog file (" DAEMON_LOGFILE ")"},
|
||||
{"nodevicecheck", BOL, &nodevicecheck, "don't check serial device"},
|
||||
{"nodevicecheck", BOL, &nodevicecheck, "don't check bus device"},
|
||||
{"pidfile", STR, &pidfile, "\tpid file (" DAEMON_PIDFILE ")"},
|
||||
{"port", NUM, &port, "\tport (" NUMSTR(SOCKET_PORT) ")"},
|
||||
{"rawdump", BOL, &rawdump, "\tdump raw ebus data to file"},
|
||||
@@ -408,9 +408,9 @@ cleanup(int state)
|
||||
log_print(L_INF, "port %d closed", port);
|
||||
}
|
||||
|
||||
/* close serial device */
|
||||
if (serialfd > 0) {
|
||||
if (eb_serial_close() == -1)
|
||||
/* close bus device */
|
||||
if (busfd > 0) {
|
||||
if (eb_bus_close() == -1)
|
||||
log_print(L_ERR, "can't close device: %s", device);
|
||||
else
|
||||
log_print(L_INF, "%s closed", device);
|
||||
@@ -467,14 +467,14 @@ main_loop(void)
|
||||
timeout_reached = NO;
|
||||
|
||||
FD_ZERO(&listenfds);
|
||||
FD_SET(serialfd, &listenfds);
|
||||
FD_SET(busfd, &listenfds);
|
||||
FD_SET(socketfd, &listenfds);
|
||||
|
||||
maxfd = socketfd;
|
||||
|
||||
/* serialfd should be always lower then socketfd */
|
||||
if (serialfd > socketfd) {
|
||||
log_print(L_ERR, "serialfd %d > %d socketfd", serialfd, socketfd);
|
||||
/* busfd should be always lower then socketfd */
|
||||
if (busfd > socketfd) {
|
||||
log_print(L_ERR, "busfd %d > %d socketfd", busfd, socketfd);
|
||||
cleanup(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -490,12 +490,12 @@ main_loop(void)
|
||||
/* set readfds to inital listenfds */
|
||||
readfds = listenfds;
|
||||
|
||||
/* check if the usb device is working */
|
||||
if (eb_serial_valid() < 0 || timeout_reached == YES) {
|
||||
/* check if the bus device is working */
|
||||
if (eb_bus_valid() < 0 || timeout_reached == YES) {
|
||||
timeout_reached = NO;
|
||||
|
||||
if (serialfd > 0 && sfd_closed == NO) {
|
||||
log_print(L_ERR, "serial device is invalid");
|
||||
if (busfd > 0 && sfd_closed == NO) {
|
||||
log_print(L_ERR, "bus device is invalid");
|
||||
sfd_closed = YES;
|
||||
|
||||
/* close listing tcp socket */
|
||||
@@ -506,8 +506,8 @@ main_loop(void)
|
||||
log_print(L_INF, "port %d closed", port);
|
||||
}
|
||||
|
||||
/* close serial device */
|
||||
if (eb_serial_close() == -1)
|
||||
/* close bus device */
|
||||
if (eb_bus_close() == -1)
|
||||
log_print(L_ERR, "can't close device: %s", device);
|
||||
else
|
||||
log_print(L_INF, "%s closed", device);
|
||||
@@ -517,8 +517,8 @@ main_loop(void)
|
||||
/* need sleep to prevent high cpu consumption */
|
||||
sleep(1);
|
||||
|
||||
/* open serial device */
|
||||
if (eb_serial_open(device, &serialfd) == 0) {
|
||||
/* open bus device */
|
||||
if (eb_bus_open(device, &busfd) == 0) {
|
||||
log_print(L_INF, "%s opened", device);
|
||||
sfd_closed = NO;
|
||||
}
|
||||
@@ -533,7 +533,7 @@ main_loop(void)
|
||||
ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout);
|
||||
|
||||
/* timeout after 10 secs means that ebus is probably
|
||||
disconnected or USB device is dead */
|
||||
disconnected or BUS device is dead */
|
||||
if (ret == 0) {
|
||||
log_print(L_WAR, "select timeout (%d) reached", timeout.tv_sec);
|
||||
timeout_reached = YES;
|
||||
@@ -550,8 +550,8 @@ main_loop(void)
|
||||
cleanup(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* new data from serial port? */
|
||||
if (FD_ISSET(serialfd, &readfds)) {
|
||||
/* new data from bus device? */
|
||||
if (FD_ISSET(busfd, &readfds)) {
|
||||
|
||||
/* get cycle message from bus */
|
||||
ret = eb_cyc_data_recv();
|
||||
@@ -717,8 +717,8 @@ main(int argc, char *argv[])
|
||||
|
||||
}
|
||||
|
||||
/* open serial device */
|
||||
if (eb_serial_open(device, &serialfd) == -1) {
|
||||
/* open bus device */
|
||||
if (eb_bus_open(device, &busfd) == -1) {
|
||||
log_print(L_ALL, "can't open device: %s", device);
|
||||
cleanup(EXIT_FAILURE);
|
||||
} else {
|
||||
|
||||
+1
-1
@@ -316,7 +316,7 @@ sock_open(int *fd, int port, int localhost)
|
||||
int ret, opt;
|
||||
struct sockaddr_in sock;
|
||||
|
||||
*fd = socket(PF_INET, SOCK_STREAM, 0);
|
||||
*fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
err_ret_if(*fd < 0, -1);
|
||||
|
||||
/* todo: verify if this realy work */
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ int main(void) {
|
||||
|
||||
int i, j, end, ret;
|
||||
|
||||
int bcd, d1b, data[SERIAL_BUFSIZE + 1];
|
||||
int bcd, d1b, data[BUS_DEVICE_BUFSIZE + 1];
|
||||
float d1c, d2b, d2c;
|
||||
|
||||
char byte;
|
||||
|
||||
+6
-6
@@ -151,9 +151,9 @@ int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int i, j, k, end, ret, val, max_argc, buslen;
|
||||
int in[SERIAL_BUFSIZE + 1];
|
||||
int in[BUS_DEVICE_BUFSIZE + 1];
|
||||
char byte;
|
||||
unsigned char msg[SERIAL_BUFSIZE + 1], bus[TMP_BUFSIZE];
|
||||
unsigned char msg[BUS_DEVICE_BUFSIZE + 1], bus[TMP_BUFSIZE];
|
||||
|
||||
progname = (const char *)strrchr(argv[0], '/');
|
||||
progname = progname ? (progname + 1) : argv[0];
|
||||
@@ -202,7 +202,7 @@ main(int argc, char *argv[])
|
||||
msg[k] = (unsigned char)
|
||||
(in[j]*16 + in[j+1]);
|
||||
|
||||
ret = eb_serial_open(device, &serialfd);
|
||||
ret = eb_bus_open(device, &serialfd);
|
||||
if (ret < 0)
|
||||
fprintf(stdout, "Error open %s.\n", device);
|
||||
|
||||
@@ -215,7 +215,7 @@ main(int argc, char *argv[])
|
||||
|
||||
}
|
||||
|
||||
ret = eb_serial_close();
|
||||
ret = eb_bus_close();
|
||||
if (ret < 0)
|
||||
fprintf(stdout, "Error close %s.\n", device);
|
||||
|
||||
@@ -250,7 +250,7 @@ main(int argc, char *argv[])
|
||||
|
||||
if (k > 0) {
|
||||
|
||||
ret = eb_serial_open(device, &serialfd);
|
||||
ret = eb_bus_open(device, &serialfd);
|
||||
if (ret < 0)
|
||||
fprintf(stdout, "Error open %s.\n", device);
|
||||
|
||||
@@ -267,7 +267,7 @@ main(int argc, char *argv[])
|
||||
|
||||
}
|
||||
|
||||
ret = eb_serial_close();
|
||||
ret = eb_bus_close();
|
||||
if (ret < 0)
|
||||
fprintf(stdout, "Error close %s.\n", device);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user