[fpc-devel] [PATCH] unix/serial.pp mods for darwin
Brad Campbell
brad at wasp.net.au
Wed Oct 1 08:41:46 CEST 2008
Jonas Maebe wrote:
>
> On 30 Sep 2008, at 17:06, Brad Campbell wrote:
>
>> These additions/changes make serial.pp work for me on MacOS X 10.4 and
>> 10.5, both PPC and Intel.
>>
>> Comments?
>
> Do you also know why these changes are necessary? Adding special cases
> from a particular platform without any comments (other than "it works
> now") is unlikely to work in the long term
Index: rtl/unix/serial.pp
===================================================================
--- rtl/unix/serial.pp (revision 11843)
+++ rtl/unix/serial.pp (working copy)
@@ -70,7 +70,14 @@
function SerOpen(const DeviceName: String): TSerialHandle;
begin
This is requires as MacOS will block on the open unless Carrier Detect is asserted. So you need to
open the port non-blocking and then clear the non-blocking flag. Found this in some apple sample
code on the apple dev site.
+ {$IFDEF DARWIN}
+ Result := fpopen(DeviceName, O_RDWR or O_NOCTTY or O_NONBLOCK);
+ { Remove the O_NONBLOCK }
+ If Result > 0 then
+ FpFCNTL(Result, F_SETFL, 0);
+ {$ELSE}
Result := fpopen(DeviceName, O_RDWR or O_NOCTTY);
+ {$ENDIF}
end;
procedure SerClose(Handle: TSerialHandle);
@@ -127,7 +134,11 @@
tios.c_ispeed := tios.c_cflag;
tios.c_ospeed := tios.c_ispeed;
This is required as Darwin does not use enums for the baud rate, and simply use the whole numbers.
In this case some of the baud rates end up asserting weird flags in the control bits. Darwin uses
c_ispeed/c_ospeed rather than extract the baud rate from c_cflag.
+{$ifndef DARWIN}
tios.c_cflag := tios.c_cflag or CREAD or CLOCAL;
+{$else}
+ tios.c_cflag := CREAD or CLOCAL;
+{$endif}
case ByteSize of
5: tios.c_cflag := tios.c_cflag or CS5;
@@ -146,9 +157,10 @@
if RtsCtsFlowControl in Flags then
tios.c_cflag := tios.c_cflag or CRTSCTS;
This is actually only required on 10.5 on Intel, but it does not seem to hurt on the other versions.
If left in place, this just blocks and stalls the program.
-
+{$IFNDEF DARWIN}
tcflush(Handle, TCIOFLUSH);
- tcsetattr(Handle, TCSANOW, tios)
+{$ENDIF}
+ tcsetattr(Handle, TCSANOW, tios);
end;
--
Dolphins are so intelligent that within a few weeks they can
train Americans to stand at the edge of the pool and throw them
fish.
More information about the fpc-devel
mailing list