--- a/SerialPort.st Tue Feb 06 22:29:04 2007 +0100
+++ b/SerialPort.st Mon Feb 12 12:31:49 2007 +0100
@@ -9,7 +9,6 @@
other person. No title to or ownership of the software is
hereby transferred.
"
-
"{ Package: 'stx:libbasic2' }"
NonPositionableExternalStream subclass:#SerialPort
@@ -231,10 +230,6 @@
portName := portNameArg.
!
-setStopBitsType:stopBitsTypeOrNil
- stopBitsType := stopBitsTypeOrNil.
-!
-
setPortName:portNameArg
baudRate:baudRateOrNil stopBitsType:stopBitsTypeOrNil
parityType:parityTypeOrNil dataBits:dataBitsOrNil
@@ -250,6 +245,10 @@
outFlowCtrlType := outFlowCtrlTypeOrNil.
xOnChar := xOnCharOrNil.
xOffChar := xOffCharOrNil.
+!
+
+setStopBitsType:stopBitsTypeOrNil
+ stopBitsType := stopBitsTypeOrNil.
! !
!SerialPort methodsFor:'low level'!
@@ -344,20 +343,20 @@
|errorSymbol errorNumber|
filePointer 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;
@@ -378,119 +377,119 @@
# define PARITY_NONE 3
if (__isString(__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 */
@@ -518,48 +517,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 */
@@ -568,26 +567,26 @@
*/
# ifdef WIN32
{
- int _fd = _open_osfhandle(port, 0);
- fp = fdopen(_fd, "r+");
+ int _fd = _open_osfhandle(port, 0);
+ fp = fdopen(_fd, "r+");
}
# 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: ;
- CloseHandle(port);
- goto getOutOfhere;
+ CloseHandle(port);
+ goto getOutOfhere;
}
{
- OBJ t;
+ OBJ t;
- t = __MKOBJ(fp);
- __INST(filePointer) = t;
- __STORE(self, t);
+ t = __MKOBJ(fp);
+ __INST(filePointer) = t;
+ __STORE(self, t);
}
getOutOfhere: ;
@@ -604,14 +603,16 @@
%}.
"all ok?"
filePointer notNil ifTrue:[
- Lobby register:self.
+ Lobby register:self.
] ifFalse:[
- errorNumber isNil ifTrue:[
- self error:'invalid argument(s)'.
- ] ifFalse:[
- (OperatingSystem errorHolderForNumber:errorNumber) reportError
- ].
+ errorNumber isNil ifTrue:[
+ self error:'invalid argument(s)'.
+ ] ifFalse:[
+ ((OperatingSystem errorHolderForNumber:errorNumber) parameter:portName) reportError
+ ].
].
+
+ "Modified: / 12-02-2007 / 12:29:57 / cg"
! !
!SerialPort methodsFor:'printing & storing'!
@@ -633,5 +634,5 @@
!SerialPort class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/SerialPort.st,v 1.7 2007-01-24 15:12:15 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/SerialPort.st,v 1.8 2007-02-12 11:31:49 cg Exp $'
! !