--- a/SerialPort.st Mon Sep 03 21:58:34 2012 +0200
+++ b/SerialPort.st Mon Sep 03 22:23:42 2012 +0200
@@ -26,10 +26,16 @@
#ifdef WIN32
+/* this is to catch uses of those - there should be none */
# undef __BEGIN_INTERRUPTABLE__
# undef __END_INTERRUPTABLE__
-# define __BEGIN_INTERRUPTABLE__ ..
-# define __END_INTERRUPTABLE__ ..
+# ifdef __TCC__
+# define __BEGIN_INTERRUPTABLE__ xxxx
+# define __END_INTERRUPTABLE__ yyyy
+# else
+# define __BEGIN_INTERRUPTABLE__ ..
+# define __END_INTERRUPTABLE__ ..
+# endif
# define WRAP_STDIO
@@ -305,36 +311,36 @@
t = __INST(handle);
if (t != nil) {
- FILE *fp;
+ FILE *fp;
- __INST(handle) = nil;
- fp = __FILEVal(t);
+ __INST(handle) = nil;
+ fp = __FILEVal(t);
#ifdef WIN32
- {
- int ret;
- SERIALPORT port;
+ {
+ int ret;
+ SERIALPORT port;
- port = PORT_FROM_FILE(fp);
+ port = PORT_FROM_FILE(fp);
# ifdef xxxDO_WRAP_CALLS
- do {
- __threadErrno = 0;
- ret = STX_C_CALL1("fclose", fclose, fp);
- } while ((ret < 0) && (__threadErrno == EINTR));
+ do {
+ __threadErrno = 0;
+ ret = STX_C_CALL1("fclose", fclose, fp);
+ } while ((ret < 0) && (__threadErrno == EINTR));
- do {
- __threadErrno = 0;
- ret = STX_WSA_CALL1("CloseHandle", CloseHandle, port);
- } while ((ret < 0) && (__threadErrno == EINTR));
+ do {
+ __threadErrno = 0;
+ ret = STX_WSA_CALL1("CloseHandle", CloseHandle, port);
+ } while ((ret < 0) && (__threadErrno == EINTR));
# else
- fclose(fp);
- /* In WIN32, apparently the fclose() does not close the SerialPort hadle,
- * so we have to do it here!
- */
- CloseHandle(port);
+ fclose(fp);
+ /* In WIN32, apparently the fclose() does not close the SerialPort hadle,
+ * so we have to do it here!
+ */
+ CloseHandle(port);
# endif /* DO_WRAP_CALLS */
- }
-#else
- fclose(fp);
+ }
+#else
+ fclose(fp);
#endif
}
%}
@@ -348,20 +354,20 @@
|errorSymbol errorNumber|
handle notNil ifTrue:[
- ^ self errorAlreadyOpen
+ ^ self errorAlreadyOpen
].
%{
FILE *fp;
SERIALPORT port;
char *__portName;
int __setBaudRate = 1,
- __setDataBits = 1,
- __setXOnChar = 1,
- __setXOffChar = 1,
- __setInFlowCtrl = 1,
- __setOutFlowCtrl = 1,
- __setStopBits = 1,
- __setParityType = 1;
+ __setDataBits = 1,
+ __setXOnChar = 1,
+ __setXOffChar = 1,
+ __setInFlowCtrl = 1,
+ __setOutFlowCtrl = 1,
+ __setStopBits = 1,
+ __setParityType = 1;
int __baudRate, __dataBits;
int __xOnChar, __xOffChar;
int __inFlowCtrl, __outFlowCtrl;
@@ -382,119 +388,119 @@
# define PARITY_NONE 3
if (__isStringLike(__INST(portName))) {
- __portName = __stringVal(__INST(portName));
+ __portName = __stringVal(__INST(portName));
} else {
- errorSymbol = @symbol(portName);
- goto getOutOfhere;
+ errorSymbol = @symbol(portName);
+ goto getOutOfhere;
}
if (__isSmallInteger(__INST(baudRate))) {
- __baudRate = __intVal(__INST(baudRate));
+ __baudRate = __intVal(__INST(baudRate));
} else if (__INST(baudRate) == nil) {
- __setBaudRate = 0;
+ __setBaudRate = 0;
} else {
- errorSymbol = @symbol(baudRate);
- goto getOutOfhere;
+ errorSymbol = @symbol(baudRate);
+ goto getOutOfhere;
}
if (__isSmallInteger(__INST(dataBits))) {
- __dataBits = __intVal(__INST(dataBits));
+ __dataBits = __intVal(__INST(dataBits));
} else if (__INST(dataBits) == nil) {
- __setDataBits = 0;
+ __setDataBits = 0;
} else {
- errorSymbol = @symbol(dataBits);
- goto getOutOfhere;
+ errorSymbol = @symbol(dataBits);
+ goto getOutOfhere;
}
if (__isSmallInteger(__INST(xOnChar))) {
- __xOnChar = __intVal(__INST(xOnChar));
+ __xOnChar = __intVal(__INST(xOnChar));
} else if (__isCharacter(__INST(xOnChar))) {
- __xOnChar = __intVal(_characterVal(__INST(xOnChar)));
+ __xOnChar = __intVal(_characterVal(__INST(xOnChar)));
} else if (__INST(xOnChar) == nil) {
- __setXOnChar = 0;
+ __setXOnChar = 0;
} else {
- errorSymbol = @symbol(xOnChar);
- goto getOutOfhere;
+ errorSymbol = @symbol(xOnChar);
+ goto getOutOfhere;
}
if (__isSmallInteger(__INST(xOffChar))) {
- __xOffChar = __intVal(__INST(xOffChar));
+ __xOffChar = __intVal(__INST(xOffChar));
} else if (__isCharacter(__INST(xOffChar))) {
- __xOffChar = __intVal(__characterVal(__INST(xOffChar)));
+ __xOffChar = __intVal(__characterVal(__INST(xOffChar)));
} else if (__INST(xOffChar) == nil) {
- __setXOffChar = 0;
+ __setXOffChar = 0;
} else {
- errorSymbol = @symbol(xOffChar);
- goto getOutOfhere;
+ errorSymbol = @symbol(xOffChar);
+ goto getOutOfhere;
}
if (__INST(inFlowCtrlType) == @symbol(xOnOff)) {
- __inFlowCtrl = FLOW_XONOFF;
+ __inFlowCtrl = FLOW_XONOFF;
} else if (__INST(inFlowCtrlType) == @symbol(hardware)) {
- __inFlowCtrl = FLOW_HARDWARE;
+ __inFlowCtrl = FLOW_HARDWARE;
} else if (__INST(inFlowCtrlType) == @symbol(none)) {
- __inFlowCtrl = FLOW_NONE;
+ __inFlowCtrl = FLOW_NONE;
} else if (__INST(inFlowCtrlType) == nil) {
- __setInFlowCtrl = 0;
+ __setInFlowCtrl = 0;
} else {
- errorSymbol = @symbol(inFlowCtrlType);
- goto getOutOfhere;
+ errorSymbol = @symbol(inFlowCtrlType);
+ goto getOutOfhere;
}
if (__INST(outFlowCtrlType) == @symbol(xOnOff)) {
- __outFlowCtrl = FLOW_XONOFF;
+ __outFlowCtrl = FLOW_XONOFF;
} else if (__INST(outFlowCtrlType) == @symbol(hardware)) {
- __outFlowCtrl = FLOW_HARDWARE;
+ __outFlowCtrl = FLOW_HARDWARE;
} else if (__INST(outFlowCtrlType) == @symbol(none)) {
- __outFlowCtrl = FLOW_NONE;
+ __outFlowCtrl = FLOW_NONE;
} else if (__INST(outFlowCtrlType) == nil) {
- __setOutFlowCtrl = 0;
+ __setOutFlowCtrl = 0;
} else {
- errorSymbol = @symbol(outFlowCtrlType);
- goto getOutOfhere;
+ errorSymbol = @symbol(outFlowCtrlType);
+ goto getOutOfhere;
}
if (__INST(stopBitsType) == @symbol(stop1)) {
- __stopBits = STOP_1;
+ __stopBits = STOP_1;
} else if (__INST(stopBitsType) == @symbol(stop2)) {
- __stopBits = STOP_2;
+ __stopBits = STOP_2;
} else if (__INST(stopBitsType) == @symbol(stop1_5)) {
- __stopBits = STOP_1_5;
+ __stopBits = STOP_1_5;
} else if (__INST(stopBitsType) == nil) {
- __setStopBits = 0;
+ __setStopBits = 0;
} else {
- errorSymbol = @symbol(stopBitsType);
- goto getOutOfhere;
+ errorSymbol = @symbol(stopBitsType);
+ goto getOutOfhere;
}
if (__INST(parityType) == @symbol(odd)) {
- __parityType = PARITY_ODD;
+ __parityType = PARITY_ODD;
} else if (__INST(parityType) == @symbol(even)) {
- __parityType = PARITY_EVEN;
+ __parityType = PARITY_EVEN;
} else if (__INST(parityType) == @symbol(none)) {
- __parityType = PARITY_NONE;
+ __parityType = PARITY_NONE;
} else if (__INST(parityType) == nil) {
- __setParityType = 0;
+ __setParityType = 0;
} else {
- errorSymbol = @symbol(parityType);
- goto getOutOfhere;
+ errorSymbol = @symbol(parityType);
+ goto getOutOfhere;
}
#ifdef WIN32
port = CreateFile(__portName,
- GENERIC_READ | GENERIC_WRITE,
- 0, /* comm devices must be opened with exclusive access */
- NULL, /* no security attrs */
- OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
- 0, /* no overlapped I/O */
- NULL /* hTemplate must be NULL for comm devices */
- );
+ GENERIC_READ | GENERIC_WRITE,
+ 0, /* comm devices must be opened with exclusive access */
+ NULL, /* no security attrs */
+ OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
+ 0, /* no overlapped I/O */
+ NULL /* hTemplate must be NULL for comm devices */
+ );
if (port == INVALID_HANDLE_VALUE) {
- console_fprintf(stderr, "Win32OS [info]: serial port open failed\n");
- errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
- errorSymbol = @symbol(openFailed);
- goto getOutOfhere;
+ console_fprintf(stderr, "Win32OS [info]: serial port open failed\n");
+ errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
+ errorSymbol = @symbol(openFailed);
+ goto getOutOfhere;
}
/* Flush the driver */
@@ -522,48 +528,48 @@
if (__setXOffChar) dcb.XoffChar = __xOffChar;
if (__setStopBits) {
- /* set stop bits */
- switch(__stopBits) {
- case STOP_1_5: dcb.StopBits = 1; break; /* 1.5 stop bits */
- case STOP_1: dcb.StopBits = 0; break; /* 1 stop bit */
- case STOP_2: dcb.StopBits = 2; break; /* 2 stop bits */
- default:
- errorSymbol = @symbol(stopBits);
- goto errExit;
- }
+ /* set stop bits */
+ switch(__stopBits) {
+ case STOP_1_5: dcb.StopBits = 1; break; /* 1.5 stop bits */
+ case STOP_1: dcb.StopBits = 0; break; /* 1 stop bit */
+ case STOP_2: dcb.StopBits = 2; break; /* 2 stop bits */
+ default:
+ errorSymbol = @symbol(stopBits);
+ goto errExit;
+ }
}
if (__setParityType) {
- /* set parity */
- switch(__parityType) {
- case PARITY_NONE: dcb.Parity = NOPARITY; break;
- case PARITY_ODD: dcb.Parity = ODDPARITY; break;
- case PARITY_EVEN: dcb.Parity = EVENPARITY; break;
- default:
- errorSymbol = @symbol(parityType);
- goto errExit;
- }
+ /* set parity */
+ switch(__parityType) {
+ case PARITY_NONE: dcb.Parity = NOPARITY; break;
+ case PARITY_ODD: dcb.Parity = ODDPARITY; break;
+ case PARITY_EVEN: dcb.Parity = EVENPARITY; break;
+ default:
+ errorSymbol = @symbol(parityType);
+ goto errExit;
+ }
}
if (__setInFlowCtrl) {
- /* set control flow */
- dcb.fInX = FALSE;
- dcb.fDtrControl = FALSE;
- if (__inFlowCtrl == FLOW_XONOFF) dcb.fInX = TRUE; /* XOn/XOff handshaking */
- if (__inFlowCtrl == FLOW_HARDWARE) dcb.fDtrControl = TRUE; /* hardware handshaking */
+ /* set control flow */
+ dcb.fInX = FALSE;
+ dcb.fDtrControl = FALSE;
+ if (__inFlowCtrl == FLOW_XONOFF) dcb.fInX = TRUE; /* XOn/XOff handshaking */
+ if (__inFlowCtrl == FLOW_HARDWARE) dcb.fDtrControl = TRUE; /* hardware handshaking */
}
if (__setOutFlowCtrl) {
- dcb.fOutX = FALSE;
- dcb.fOutxCtsFlow = FALSE;
+ dcb.fOutX = FALSE;
+ dcb.fOutxCtsFlow = FALSE;
- if (__outFlowCtrl == FLOW_XONOFF) dcb.fOutX = TRUE; /* XOn/XOff handshaking */
- if (__outFlowCtrl == FLOW_HARDWARE) dcb.fOutxCtsFlow = TRUE; /* hardware handshaking */
+ if (__outFlowCtrl == FLOW_XONOFF) dcb.fOutX = TRUE; /* XOn/XOff handshaking */
+ if (__outFlowCtrl == FLOW_HARDWARE) dcb.fOutxCtsFlow = TRUE; /* hardware handshaking */
}
if (! SetCommState(port, &dcb)) {
- console_fprintf(stderr, "Win32OS [info]: serial port comm-setup failed\n");
- errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
- goto errExit;
+ console_fprintf(stderr, "Win32OS [info]: serial port comm-setup failed\n");
+ errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
+ goto errExit;
}
# endif /* WIN32 */
@@ -572,31 +578,31 @@
*/
# ifdef WIN32
{
- int _fd;
- __stxWrapApiEnterCritical();
- _fd = _open_osfhandle((long)port, 0);
- fp = fdopen(_fd, "r+");
- __stxWrapApiLeaveCritical();
+ int _fd;
+ __stxWrapApiEnterCritical();
+ _fd = _open_osfhandle((long)port, 0);
+ fp = fdopen(_fd, "r+");
+ __stxWrapApiLeaveCritical();
}
# else
fp = fdopen(port, "r+");
# endif
if (! fp) {
- console_fprintf(stderr, "Win32OS [info]: fdopen failed\n");
- errorNumber = __MKSMALLINT(errno);
+ console_fprintf(stderr, "Win32OS [info]: fdopen failed\n");
+ errorNumber = __MKSMALLINT(errno);
errExit: ;
# ifdef WIN32
- CloseHandle(port);
+ CloseHandle(port);
# endif
- goto getOutOfhere;
+ goto getOutOfhere;
}
{
- OBJ t;
+ OBJ t;
- t = __MKEXTERNALADDRESS(fp);
- __INST(handle) = t;
- __STORE(self, t);
+ t = __MKEXTERNALADDRESS(fp);
+ __INST(handle) = t;
+ __STORE(self, t);
}
getOutOfhere: ;
@@ -613,13 +619,13 @@
%}.
"all ok?"
handle notNil ifTrue:[
- Lobby register:self.
+ Lobby register:self.
] ifFalse:[
- errorNumber isNil ifTrue:[
- self error:'invalid argument(s)'.
- ] ifFalse:[
- ((OperatingSystem errorHolderForNumber:errorNumber) parameter:portName) reportError
- ].
+ errorNumber isNil ifTrue:[
+ self error:'invalid argument(s)'.
+ ] ifFalse:[
+ ((OperatingSystem errorHolderForNumber:errorNumber) parameter:portName) reportError
+ ].
].
"Modified: / 05-08-2011 / 14:14:08 / cg"
@@ -646,9 +652,9 @@
!SerialPort class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/SerialPort.st,v 1.19 2012-07-19 17:36:36 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/SerialPort.st,v 1.20 2012-09-03 20:23:42 cg Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic2/SerialPort.st,v 1.19 2012-07-19 17:36:36 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/SerialPort.st,v 1.20 2012-09-03 20:23:42 cg Exp $'
! !