summaryrefslogtreecommitdiff
path: root/navit
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2010-11-04 20:35:27 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2010-11-04 20:35:27 +0000
commitaff2c62d153c67323ecb2d14fc9a6af84f56bf98 (patch)
treedbc896fd1a6a8788dfbee3c5fdbfa39f847f1089 /navit
parent22bdef18f4aee574cf04af4776331f69a2e1997e (diff)
downloadnavit-aff2c62d153c67323ecb2d14fc9a6af84f56bf98.tar.gz
Fix:vehicle_file:Fixed win32 support, patch from #332|Thanks richt
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@3644 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit')
-rw-r--r--navit/Makefile.am2
-rw-r--r--navit/support/win32/Makefile.am3
-rw-r--r--navit/support/win32/serial_io.c130
-rw-r--r--navit/support/win32/serial_io.h35
-rw-r--r--navit/vehicle/file/Makefile.am7
-rw-r--r--navit/vehicle/file/vehicle_file.c127
6 files changed, 185 insertions, 119 deletions
diff --git a/navit/Makefile.am b/navit/Makefile.am
index f0ee201b7..eef8bca83 100644
--- a/navit/Makefile.am
+++ b/navit/Makefile.am
@@ -34,7 +34,7 @@ endif
if SHARED_LIBNAVIT
lib_LTLIBRARIES = lib@LIBNAVIT@.la
- lib@LIBNAVIT@_la_LDFLAGS = -avoid-version @MODULE_LDFLAGS@ -no-undefined -Wl,--no-undefined
+ lib@LIBNAVIT@_la_LDFLAGS = -avoid-version @MODULE_LDFLAGS@ @NAVIT_SOCKET_LDFLAGS@ -no-undefined -Wl,--no-undefined
else
noinst_LTLIBRARIES = lib@LIBNAVIT@.la
endif
diff --git a/navit/support/win32/Makefile.am b/navit/support/win32/Makefile.am
index 0b71ae19f..aee4350cb 100644
--- a/navit/support/win32/Makefile.am
+++ b/navit/support/win32/Makefile.am
@@ -1,4 +1,5 @@
include $(top_srcdir)/Makefile.inc
AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_win32
noinst_LTLIBRARIES = libsupport_win32.la
-libsupport_win32_la_SOURCES = mmap.c win32_init.c sys/mman.h ConvertUTF.c ConvertUTF.h
+libsupport_win32_la_SOURCES = mmap.c win32_init.c sys/mman.h ConvertUTF.c ConvertUTF.h serial_io.c addwinsock.c
+
diff --git a/navit/support/win32/serial_io.c b/navit/support/win32/serial_io.c
index fef6d3833..643201c5b 100644
--- a/navit/support/win32/serial_io.c
+++ b/navit/support/win32/serial_io.c
@@ -3,24 +3,24 @@
#include "serial_io.h"
#include "debug.h"
-//***************************************************************************
-/** @fn int serial_io_init( const char* port, const char* strsettings )
-*****************************************************************************
-* @b Description: initialise a serial port communication
-*****************************************************************************
-* @param port : port name
-* example 'COM7'
-* @param strsettings : port settings
-* example ; 'baud=115200 parity=N data=8 stop=1'
-*****************************************************************************
-* @return file descriptor
-* -1 if error
-*****************************************************************************
-**/
+//***************************************************************************
+/** @fn int serial_io_init( const char* port, const char* strsettings )
+*****************************************************************************
+* @b Description: initialise a serial port communication
+*****************************************************************************
+* @param port : port name
+* example 'COM7'
+* @param strsettings : port settings
+* example ; 'baud=115200 parity=N data=8 stop=1'
+*****************************************************************************
+* @return file descriptor
+* -1 if error
+*****************************************************************************
+**/
int serial_io_init( const char* port, const char* strsettings )
{
HANDLE hCom = NULL;
-
+
char strport[16];
snprintf( strport, sizeof( strport ), "\\\\.\\%s", port );
@@ -48,7 +48,7 @@ int serial_io_init( const char* port, const char* strsettings )
0,
NULL
);
- dbg(1, "return (fd) : '-1' : serial_io_init error : '%s'\n", lpMsgBuf);
+ dbg(1, "return (fd) : '-1' : serial_io_init error : '%s'\n", lpMsgBuf);
LocalFree( lpMsgBuf ); // Free the buffer.
return -1;
@@ -73,34 +73,34 @@ int serial_io_init( const char* port, const char* strsettings )
SetCommTimeouts(hCom, &sCT);
- dbg(1, "serial_io_init return (fd) : '%d'\n", (int)hCom);
-
+ dbg(1, "serial_io_init return (fd) : '%d'\n", (int)hCom);
+
return (int)hCom;
}
-//***************************************************************************
-/** @fn int serial_io_read( int fd, char * buffer, int buffer_size )
-*****************************************************************************
-* @b Description: Read bytes on the serial port
-*****************************************************************************
-* @param fd : file descriptor
-* @param buffer : buffer for data
-* @param buffer_size : size in byte of the buffer
-*****************************************************************************
-* @return number of bytes read
-*****************************************************************************
-* @remarks buffer must be allocated by the caller
-*****************************************************************************
-**/
+//***************************************************************************
+/** @fn int serial_io_read( int fd, char * buffer, int buffer_size )
+*****************************************************************************
+* @b Description: Read bytes on the serial port
+*****************************************************************************
+* @param fd : file descriptor
+* @param buffer : buffer for data
+* @param buffer_size : size in byte of the buffer
+*****************************************************************************
+* @return number of bytes read
+*****************************************************************************
+* @remarks buffer must be allocated by the caller
+*****************************************************************************
+**/
int serial_io_read( int fd, char * buffer, int buffer_size )
{
- dbg(1, "serial_io_read fd = %d buffer_size = %d\n", fd, buffer_size);
-
+ dbg(1, "serial_io_read fd = %d buffer_size = %d\n", fd, buffer_size);
+
DWORD dwBytesIn = 0;
if (fd <= 0)
{
- dbg(0, "serial_io_read return (dwBytesIn) : '0'\n");
+ dbg(0, "serial_io_read return (dwBytesIn) : '0'\n");
*buffer = 0;
return 0;
}
@@ -111,36 +111,36 @@ int serial_io_read( int fd, char * buffer, int buffer_size )
{
buffer[dwBytesIn] = 0;
}
- else
+ else
{
- dwBytesIn = 0;
+ dwBytesIn = 0;
buffer[0] = 0;
}
- if (dwBytesIn > 0)
- {
- dbg(1,"GPS < %s\n",buffer );
- }
+ if (dwBytesIn > 0)
+ {
+ dbg(1,"GPS < %s\n",buffer );
+ }
buffer[buffer_size - 1] = 0;
- dbg(2, "serial_io_read return (dwBytesIn) : '%d'\n", dwBytesIn);
+ dbg(2, "serial_io_read return (dwBytesIn) : '%d'\n", dwBytesIn);
return dwBytesIn;
}
-//***************************************************************************
-/** @fn int serial_io_write(int fd, const char * buffer)
-*****************************************************************************
-* @b Description: Write bytes on the serial port
-*****************************************************************************
-* @param fd : file descriptor
-* @param buffer : data buffer (null terminated)
-*****************************************************************************
-* @return number of bytes written
-*****************************************************************************
-**/
+//***************************************************************************
+/** @fn int serial_io_write(int fd, const char * buffer)
+*****************************************************************************
+* @b Description: Write bytes on the serial port
+*****************************************************************************
+* @param fd : file descriptor
+* @param buffer : data buffer (null terminated)
+*****************************************************************************
+* @return number of bytes written
+*****************************************************************************
+**/
int serial_io_write(int fd, const char * buffer)
{
- dbg(1, "serial_io_write fd = %d buffer = '%s'\n",fd, buffer);
-
+ dbg(1, "serial_io_write fd = %d buffer = '%s'\n",fd, buffer);
+
DWORD dwBytesOut = 0;
WriteFile((HANDLE)fd, buffer, strlen(buffer), &dwBytesOut, NULL);
@@ -148,18 +148,18 @@ int serial_io_write(int fd, const char * buffer)
return dwBytesOut;
}
-//***************************************************************************
-/** @fn void serial_io_shutdown(int fd )
-*****************************************************************************
-* @b Description: Terminate serial communication
-*****************************************************************************
-* @param fd : file descriptor
-*****************************************************************************
-**/
+//***************************************************************************
+/** @fn void serial_io_shutdown(int fd )
+*****************************************************************************
+* @b Description: Terminate serial communication
+*****************************************************************************
+* @param fd : file descriptor
+*****************************************************************************
+**/
void serial_io_shutdown(int fd )
{
- dbg(1, "serial_io_shutdown fd = %d\n",fd);
-
+ dbg(1, "serial_io_shutdown fd = %d\n",fd);
+
if (fd > 0)
{
CloseHandle((HANDLE)fd);
diff --git a/navit/support/win32/serial_io.h b/navit/support/win32/serial_io.h
index 4c7b8a31c..0526a217a 100644
--- a/navit/support/win32/serial_io.h
+++ b/navit/support/win32/serial_io.h
@@ -3,7 +3,40 @@
int serial_io_init( const char* port, const char* strsettings );
int serial_io_read(int fd, char * buffer, int buffer_size );
-int WriteSerial(int fd, const char * buffer);
+int serial_io_write(int fd, const char * buffer);
void serial_io_shutdown(int fd );
+typedef unsigned int speed_t;
+
+#define B0 0000000
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
#endif
diff --git a/navit/vehicle/file/Makefile.am b/navit/vehicle/file/Makefile.am
index c1b70479a..ce3a45b65 100644
--- a/navit/vehicle/file/Makefile.am
+++ b/navit/vehicle/file/Makefile.am
@@ -1,12 +1,15 @@
include $(top_srcdir)/Makefile.inc
AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit
-modulevehicle_LTLIBRARIES = libvehicle_file.la libvehicle_pipe.la libvehicle_socket.la
+modulevehicle_LTLIBRARIES = libvehicle_file.la libvehicle_pipe.la libvehicle_socket.la libvehicle_serial.la
libvehicle_file_la_CFLAGS=-DMODULE=vehicle_file
libvehicle_file_la_SOURCES = vehicle_file.c
-libvehicle_file_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@
+libvehicle_file_la_LDFLAGS = -module -avoid-version @NAVIT_SOCKET_LDFLAGS@ @NAVIT_MODULE_LDFLAGS@
libvehicle_pipe_la_CFLAGS=-DMODULE=vehicle_pipe
libvehicle_pipe_la_SOURCES = vehicle_pipe.c
libvehicle_pipe_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@
libvehicle_socket_la_CFLAGS=-DMODULE=vehicle_socket
libvehicle_socket_la_SOURCES = vehicle_socket.c
libvehicle_socket_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@
+libvehicle_serial_la_CFLAGS=-DMODULE=vehicle_serial
+libvehicle_serial_la_SOURCES = vehicle_serial.c
+libvehicle_serial_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@
diff --git a/navit/vehicle/file/vehicle_file.c b/navit/vehicle/file/vehicle_file.c
index ec3d2c269..f4b29d0eb 100644
--- a/navit/vehicle/file/vehicle_file.c
+++ b/navit/vehicle/file/vehicle_file.c
@@ -44,6 +44,17 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
+#ifdef HAVE_WINSOCK
+#include <winsock2.h>
+int inet_aton(const char *cp, struct in_addr *inp);
+
+int inet_aton(const char *cp, struct in_addr *inp)
+{
+ unsigned long addr = inet_addr(cp);
+ inp->S_un.S_addr = addr;
+ return addr!=-1;
+}
+#endif
static void vehicle_file_disable_watch(struct vehicle_priv *priv);
static void vehicle_file_enable_watch(struct vehicle_priv *priv);
@@ -53,7 +64,7 @@ static void vehicle_file_close(struct vehicle_priv *priv);
enum file_type {
- file_type_pipe = 1, file_type_device, file_type_file, file_type_socket
+ file_type_pipe = 1, file_type_device, file_type_file, file_type_socket, file_type_serial
};
static int buffer_size = 1024;
@@ -96,11 +107,10 @@ struct vehicle_priv {
int no_data_count;
struct event_timeout * timeout;
struct callback *timeout_callback;
-#else
+#endif
enum file_type file_type;
FILE *file;
struct event_watch *watch;
-#endif
speed_t baudrate;
struct attr ** attrs;
char fixiso8601[128];
@@ -205,34 +215,13 @@ static int vehicle_win32_serial_track(struct vehicle_priv *priv)
static int
vehicle_file_open(struct vehicle_priv *priv)
{
-#ifdef _WIN32
- dbg(1, "enter, priv->source='%s'\n", priv->source);
-
- if ( priv->source )
- {
- char* raw_setting_str = g_strdup( priv->source );
-
- char* strport = strchr(raw_setting_str, ':' );
- char* strsettings = strchr(raw_setting_str, ' ' );
-
- if ( strport && strsettings )
- {
- strport++;
- *strsettings = '\0';
- strsettings++;
-
- priv->fd=serial_io_init( strport, strsettings );
- }
- g_free( raw_setting_str );
-
- // Add the callback
- dbg(2, "Add the callback ...\n", priv->source);
- priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv);
- }
-#else
char *name;
struct stat st;
+#ifndef _WIN32
struct termios tio;
+#else
+ #define O_NDELAY 0
+#endif
name = priv->source + 5;
if (!strncmp(priv->source, "file:", 5)) {
@@ -242,7 +231,9 @@ vehicle_file_open(struct vehicle_priv *priv)
stat(name, &st);
if (S_ISREG(st.st_mode)) {
priv->file_type = file_type_file;
- } else {
+ }
+#ifndef _WIN32
+ else {
tcgetattr(priv->fd, &tio);
cfmakeraw(&tio);
cfsetispeed(&tio, priv->baudrate);
@@ -258,8 +249,13 @@ vehicle_file_open(struct vehicle_priv *priv)
return 0;
priv->fd = fileno(priv->file);
priv->file_type = file_type_pipe;
-#ifdef HAVE_SOCKET
+#endif //!_WIN32
+#if defined(HAVE_SOCKET) || defined(HAVE_WINSOCK)
} else if (!strncmp(priv->source,"socket:", 7)) {
+ #ifdef _WIN32
+ WSADATA wsi;
+ WSAStartup(0x00020002,&wsi);
+ #endif
char *p,*s=g_strdup(priv->source+7);
struct sockaddr_in sin;
p=strchr(s,':');
@@ -285,9 +281,31 @@ vehicle_file_open(struct vehicle_priv *priv)
}
}
priv->file_type = file_type_socket;
-#endif
- }
-#endif
+#endif //HAVE_SOCKET
+ } else if (!strncmp(priv->source,"serial:",7)) {
+#ifdef _WIN32
+ char* raw_setting_str = g_strdup( priv->source );
+
+ char* strport = strchr(raw_setting_str, ':' );
+ char* strsettings = strchr(raw_setting_str, ' ' );
+
+ if ( strport && strsettings )
+ {
+ strport++;
+ *strsettings = '\0';
+ strsettings++;
+
+ priv->fd=serial_io_init( strport, strsettings );
+ }
+ g_free( raw_setting_str );
+ priv->file_type = file_type_serial;
+ // Add the callback
+ dbg(2, "Add the callback ...\n", priv->source);
+ priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv);
+#else
+ //TODO - add linux serial
+#endif //!_WIN32
+ }
return(priv->fd != -1);
}
@@ -305,19 +323,24 @@ vehicle_file_close(struct vehicle_priv *priv)
dbg(1, "enter, priv->fd='%d'\n", priv->fd);
vehicle_file_disable_watch(priv);
#ifdef _WIN32
- if (priv->timeout_callback) {
+ if(priv->file_type == file_type_serial)
+ {
+ if (priv->timeout_callback) {
callback_destroy(priv->timeout_callback);
priv->timeout_callback=NULL; // dangling pointer! prevent double freeing.
- }
+ }
serial_io_shutdown( priv->fd );
-#else
+ }
+ else
+#endif
+ {
if (priv->file)
pclose(priv->file);
else if (priv->fd >= 0)
close(priv->fd);
priv->file = NULL;
-#endif
priv->fd = -1;
+ }
}
//***************************************************************************
@@ -393,7 +416,7 @@ vehicle_file_parse(struct vehicle_priv *priv, char *buffer)
return ret;
}
if (bcsum != csum && priv->checksum_ignore == 0) {
- dbg(0, "wrong checksum in '%s'\n", buffer);
+ dbg(0, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum);
return ret;
}
@@ -457,14 +480,12 @@ vehicle_file_parse(struct vehicle_priv *priv, char *buffer)
g_free(priv->nmea_data);
priv->nmea_data=priv->nmea_data_buf;
priv->nmea_data_buf=NULL;
-#ifndef _WIN32
if (priv->file_type == file_type_file) {
if (priv->watch) {
vehicle_file_disable_watch(priv);
event_add_timeout(priv->time, 0, priv->cbt);
}
}
-#endif
}
if (!strncmp(buffer, "$GPVTG", 6)) {
/* 0 1 2 34 5 6 7 8
@@ -582,14 +603,13 @@ vehicle_file_parse(struct vehicle_priv *priv, char *buffer)
*****************************************************************************
* @param priv : pointer on the private data of the plugin
*****************************************************************************
-* @remarks Not used on WIN32 operating system
+* @remarks
*****************************************************************************
**/
static void
vehicle_file_io(struct vehicle_priv *priv)
{
dbg(1, "vehicle_file_io : enter\n");
-#ifndef _WIN32
int size, rc = 0;
char *str, *tok;
@@ -636,7 +656,6 @@ vehicle_file_io(struct vehicle_priv *priv)
}
if (rc)
callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
-#endif
}
//***************************************************************************
@@ -653,14 +672,18 @@ vehicle_file_enable_watch(struct vehicle_priv *priv)
dbg(1, "enter\n");
#ifdef _WIN32
// add an event : don't use glib timers and g_timeout_add
+ if (priv->file_type == file_type_serial)
+ {
if (priv->timeout_callback != NULL)
- priv->timeout = event_add_timeout(500, 1, priv->timeout_callback);
+ priv->timeout = event_add_timeout(500, 1, priv->timeout_callback);
+ else
+ dbg(1, "error : watch not enabled : priv->timeout_callback is null\n"); }
else
- dbg(1, "error : watch not enabled : priv->timeout_callback is null\n");
-#else
+#endif
+ {
if (! priv->watch)
priv->watch = event_add_watch((void *)priv->fd, event_watch_cond_read, priv->cb);
-#endif
+ }
}
//***************************************************************************
@@ -676,15 +699,20 @@ vehicle_file_disable_watch(struct vehicle_priv *priv)
{
dbg(1, "vehicle_file_disable_watch : enter\n");
#ifdef _WIN32
+ if(priv->file_type == file_type_serial)
+ {
if (priv->timeout) {
event_remove_timeout(priv->timeout);
priv->timeout=NULL; // dangling pointer! prevent double freeing.
+ }
}
-#else
+ else
+#endif //!_WIN32
+ {
if (priv->watch)
event_remove_watch(priv->watch);
priv->watch = NULL;
-#endif
+ }
}
//***************************************************************************
@@ -970,4 +998,5 @@ void plugin_init(void)
plugin_register_vehicle_type("file", vehicle_file_new_file);
plugin_register_vehicle_type("pipe", vehicle_file_new_file);
plugin_register_vehicle_type("socket", vehicle_file_new_file);
+ plugin_register_vehicle_type("serial", vehicle_file_new_file);
}