update server/drivers/CFontz633io.c so that it checks for an appropriate
response when sending a packet; adapt autoconf infrastructure to support that
This commit is contained in:
@@ -45,6 +45,11 @@ fi
|
|||||||
cfontz633)
|
cfontz633)
|
||||||
DRIVERS="$DRIVERS CFontz633${SO}"
|
DRIVERS="$DRIVERS CFontz633${SO}"
|
||||||
actdrivers=["$actdrivers cfontz633"]
|
actdrivers=["$actdrivers cfontz633"]
|
||||||
|
AC_CHECK_FUNCS(select, [
|
||||||
|
AC_CHECK_HEADERS(sys/select.h)
|
||||||
|
],[
|
||||||
|
AC_MSG_WARN([The CFontz633 driver needs the select() function])
|
||||||
|
])
|
||||||
;;
|
;;
|
||||||
lcterm)
|
lcterm)
|
||||||
DRIVERS="$DRIVERS lcterm${SO}"
|
DRIVERS="$DRIVERS lcterm${SO}"
|
||||||
|
|||||||
@@ -15,11 +15,21 @@
|
|||||||
* ===========================================================================
|
* ===========================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "CFontz633io.h"
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#if defined(HAVE_SYS_SELECT_H)
|
||||||
|
# include <sys/select.h>
|
||||||
|
#else
|
||||||
|
# include <sys/time.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif /* defined(HAVE_SYS_SELECT_H) */
|
||||||
|
|
||||||
|
#include "CFontz633io.h"
|
||||||
|
|
||||||
|
|
||||||
#define TRY_AGAIN 0
|
#define TRY_AGAIN 0
|
||||||
#define GOOD_MSG 1
|
#define GOOD_MSG 1
|
||||||
@@ -29,7 +39,7 @@
|
|||||||
/* static local functions */
|
/* static local functions */
|
||||||
static void send_packet(int fd, COMMAND_PACKET *out);
|
static void send_packet(int fd, COMMAND_PACKET *out);
|
||||||
static int get_crc(char *buf, int len, int seed);
|
static int get_crc(char *buf, int len, int seed);
|
||||||
static int test_packet(int fd);
|
static int test_packet(int fd, unsigned char response);
|
||||||
static void treat_packet(void);
|
static void treat_packet(void);
|
||||||
static int check_for_packet(int fd, unsigned char expected_length);
|
static int check_for_packet(int fd, unsigned char expected_length);
|
||||||
static void print_packet(COMMAND_PACKET *packet);
|
static void print_packet(COMMAND_PACKET *packet);
|
||||||
@@ -133,7 +143,7 @@ void send_zerobyte_message(int fd, unsigned char msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** send outgoing_response to the given handle; calc & send CRC when doing so */
|
/** send out to the given handle; calc & send CRC when doing so */
|
||||||
static void
|
static void
|
||||||
send_packet(int fd, COMMAND_PACKET *out)
|
send_packet(int fd, COMMAND_PACKET *out)
|
||||||
{
|
{
|
||||||
@@ -147,14 +157,10 @@ send_packet(int fd, COMMAND_PACKET *out)
|
|||||||
write(fd, out->crc.as_bytes, 2);
|
write(fd, out->crc.as_bytes, 2);
|
||||||
|
|
||||||
/**** TEST STUFF ****/
|
/**** TEST STUFF ****/
|
||||||
// print_packet(&outgoing_response);
|
// print_packet(out);
|
||||||
|
|
||||||
#if defined(CFONTZ633_WRITE_DELAY) && (CFONTZ633_WRITE_DELAY > 0)
|
|
||||||
usleep(CFONTZ633_WRITE_DELAY);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Every time we send a message, we also check for an incoming one. */
|
/* Every time we send a message, we also check for an incoming one. */
|
||||||
test_packet(fd);
|
test_packet(fd, 0x40 | out->command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -249,6 +255,21 @@ void SyncReceiveBuffer(ReceiveBuffer *rb, int fd, unsigned int number)
|
|||||||
unsigned char buffer[MAX_DATA_LENGTH];
|
unsigned char buffer[MAX_DATA_LENGTH];
|
||||||
int BytesRead;
|
int BytesRead;
|
||||||
|
|
||||||
|
#if defined(HAVE_SELECT) && defined(CFONTZ633_WRITE_DELAY) && (CFONTZ633_WRITE_DELAY > 0)
|
||||||
|
fd_set rfds;
|
||||||
|
struct timeval timeout;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
FD_ZERO(&rfds);
|
||||||
|
FD_SET(fd, &rfds);
|
||||||
|
timeout.tv_sec = 0;
|
||||||
|
timeout.tv_usec = CFONTZ633_WRITE_DELAY;
|
||||||
|
retval = select(fd + 1, &rfds, NULL, NULL, &timeout);
|
||||||
|
|
||||||
|
if (!retval)
|
||||||
|
return;
|
||||||
|
#endif /* defined(HAVE_SELECT) && defined(CFONTZ633_WRITE_DELAY) && (CFONTZ633_WRITE_DELAY > 0) */
|
||||||
|
|
||||||
if (number > MAX_DATA_LENGTH)
|
if (number > MAX_DATA_LENGTH)
|
||||||
number = MAX_DATA_LENGTH;
|
number = MAX_DATA_LENGTH;
|
||||||
BytesRead = read(fd, buffer, number);
|
BytesRead = read(fd, buffer, number);
|
||||||
@@ -362,10 +383,27 @@ unsigned char PeekByte(ReceiveBuffer *rb)
|
|||||||
* byte read from the serial port
|
* byte read from the serial port
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
test_packet(int fd)
|
test_packet(int fd, unsigned char response)
|
||||||
{
|
{
|
||||||
int is_msg;
|
int is_msg;
|
||||||
|
|
||||||
|
#if defined(HAVE_SELECT) && defined(CFONTZ633_WRITE_DELAY) && (CFONTZ633_WRITE_DELAY > 0)
|
||||||
|
int response_received = 0;
|
||||||
|
|
||||||
|
while (!response_received) {
|
||||||
|
is_msg = check_for_packet(fd, MAX_DATA_LENGTH);
|
||||||
|
while (is_msg != GIVE_UP) {
|
||||||
|
if (is_msg == GOOD_MSG) {
|
||||||
|
treat_packet();
|
||||||
|
// do we need treat_packet at all ?
|
||||||
|
if (incoming_command.command == response)
|
||||||
|
response_received = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_msg = check_for_packet(fd, MAX_DATA_LENGTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
is_msg = check_for_packet(fd, MAX_DATA_LENGTH);
|
is_msg = check_for_packet(fd, MAX_DATA_LENGTH);
|
||||||
while (is_msg != GIVE_UP) {
|
while (is_msg != GIVE_UP) {
|
||||||
if (is_msg == GOOD_MSG)
|
if (is_msg == GOOD_MSG)
|
||||||
@@ -373,6 +411,7 @@ test_packet(int fd)
|
|||||||
|
|
||||||
is_msg = check_for_packet(fd, MAX_DATA_LENGTH);
|
is_msg = check_for_packet(fd, MAX_DATA_LENGTH);
|
||||||
}
|
}
|
||||||
|
#endif /* defined(HAVE_SELECT) && defined(CFONTZ633_WRITE_DELAY) && (CFONTZ633_WRITE_DELAY > 0) */
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user