Commit 6ff2eef121011c823b9a601016b679aa81dd63b0
1 parent
2f75f7a1
Support of MacOSX, based on the work of Matthew Butch.
Need testing.
Showing
3 changed files
with
38 additions
and
9 deletions
modbus/modbus.c
| ... | ... | @@ -29,7 +29,6 @@ |
| 29 | 29 | http://www.easysw.com/~mike/serial/serial.html |
| 30 | 30 | */ |
| 31 | 31 | |
| 32 | -#include <fcntl.h> | |
| 33 | 32 | #include <stdio.h> |
| 34 | 33 | #include <string.h> |
| 35 | 34 | #include <stdlib.h> |
| ... | ... | @@ -37,6 +36,8 @@ |
| 37 | 36 | #include <sys/time.h> |
| 38 | 37 | #include <unistd.h> |
| 39 | 38 | #include <errno.h> |
| 39 | +#include <limits.h> | |
| 40 | +#include <fcntl.h> | |
| 40 | 41 | |
| 41 | 42 | /* TCP */ |
| 42 | 43 | #include <sys/types.h> |
| ... | ... | @@ -45,9 +46,15 @@ |
| 45 | 46 | #include <netinet/in.h> |
| 46 | 47 | #include <netinet/ip.h> |
| 47 | 48 | #include <netinet/tcp.h> |
| 49 | +#include <arpa/inet.h> | |
| 48 | 50 | |
| 49 | 51 | #include "modbus.h" |
| 50 | 52 | |
| 53 | +#ifdef SYS_PLATFORM_DARWIN | |
| 54 | + #include <netdb.h> | |
| 55 | + #define SOL_CTP getprotobyname("TCP")->p_proto | |
| 56 | +#endif | |
| 57 | + | |
| 51 | 58 | #define UNKNOWN_ERROR_MSG "Not defined in modbus specification" |
| 52 | 59 | |
| 53 | 60 | static const int SIZE_TAB_ERROR_MSG = 12; |
| ... | ... | @@ -1292,9 +1299,11 @@ static int modbus_connect_rtu(modbus_param_t *mb_param) |
| 1292 | 1299 | tios.c_cflag |= PARODD; |
| 1293 | 1300 | } |
| 1294 | 1301 | |
| 1295 | - /* Read your man page for the meaning of all this (man | |
| 1296 | - termios). Its a bit to involved to comment here :) */ | |
| 1297 | - tios.c_line = 0; | |
| 1302 | + /* Read the man page of termios if you need more information. */ | |
| 1303 | + | |
| 1304 | + /* This field isn't used on POSIX systems | |
| 1305 | + tios.c_line = 0; | |
| 1306 | + */ | |
| 1298 | 1307 | |
| 1299 | 1308 | /* C_LFLAG Line options |
| 1300 | 1309 | ... | ... |
modbus/modbus.h
| ... | ... | @@ -109,11 +109,23 @@ |
| 109 | 109 | |
| 110 | 110 | typedef enum { RTU, TCP } type_com_t; |
| 111 | 111 | |
| 112 | +/* This structure is byte-aligned */ | |
| 112 | 113 | typedef struct { |
| 113 | 114 | /* Communication : RTU or TCP */ |
| 114 | 115 | type_com_t type_com; |
| 115 | - /* Device: "/dev/ttyS0" or "/dev/ttyUSB0" */ | |
| 116 | + | |
| 117 | + /* Device: "/dev/ttyS0", "/dev/ttyUSB0" or "/dev/tty.USA19*" | |
| 118 | + on Mac OS X for KeySpan USB<->Serial adapters this string | |
| 119 | + had to be made bigger on OS X as the directory+file name | |
| 120 | + was bigger than 19 bytes. Making it 67 bytes for now, but | |
| 121 | + OS X does support 256 byte file names. May become a problem | |
| 122 | + in the future. */ | |
| 123 | +#ifdef SYS_PLATFORM_DARWIN | |
| 124 | + char device[67]; | |
| 125 | +#else | |
| 116 | 126 | char device[19]; |
| 127 | +#endif | |
| 128 | + | |
| 117 | 129 | /* Parity: "even", "odd", "none" */ |
| 118 | 130 | char parity[5]; |
| 119 | 131 | /* Bauds: 19200 */ | ... | ... |
wscript
| ... | ... | @@ -16,9 +16,10 @@ def configure(conf): |
| 16 | 16 | conf.check_tool('compiler_cc') |
| 17 | 17 | conf.check_tool('misc') |
| 18 | 18 | |
| 19 | - headers = 'arpa/inet.h fcntl.h netinet/in.h stdlib.h \ | |
| 20 | - string.h sys/ioctl.h sys/socket.h sys/time.h \ | |
| 21 | - termios.h unistd.h' | |
| 19 | + headers = 'stdio.h string.h stdlib.h termios.h sys/time.h \ | |
| 20 | + unistd.h errno.h limits.h fcntl.h \ | |
| 21 | + sys/types.h sys/socket.h sys/ioctl.h \ | |
| 22 | + netinet/in.h netinet/ip.h netinet/tcp.h arpa/inet.h' | |
| 22 | 23 | |
| 23 | 24 | # check for headers and append found headers to headers_found for later use |
| 24 | 25 | headers_found = [] |
| ... | ... | @@ -27,6 +28,7 @@ def configure(conf): |
| 27 | 28 | headers_found.append(header) |
| 28 | 29 | |
| 29 | 30 | functions_defines = ( |
| 31 | + ('setsockopt', 'HAVE_SETSOCKOPT'), | |
| 30 | 32 | ('inet_ntoa', 'HAVE_INET_NTOA'), |
| 31 | 33 | ('memset', 'HAVE_MEMSET'), |
| 32 | 34 | ('select', 'HAVE_SELECT'), |
| ... | ... | @@ -39,10 +41,16 @@ def configure(conf): |
| 39 | 41 | e.headers = headers_found |
| 40 | 42 | e.define = define |
| 41 | 43 | e.run() |
| 42 | - | |
| 44 | + | |
| 43 | 45 | conf.define('VERSION', VERSION) |
| 44 | 46 | conf.define('PACKAGE', 'libmodbus') |
| 45 | 47 | |
| 48 | + import sys | |
| 49 | + if sys.platform[:6] == 'darwin': | |
| 50 | + print "Darwin platform detected" | |
| 51 | + conf.env.append_value('CCFLAGS', '-DPLATFORM_DARWIN') | |
| 52 | + conf.define('PLATFORM_DARWIN', '1') | |
| 53 | + | |
| 46 | 54 | conf.write_config_header() |
| 47 | 55 | |
| 48 | 56 | def build(bld): | ... | ... |