AnySerialPort.pm 2.34 KB
Newer Older
Stefan Tauner's avatar
Stefan Tauner committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Lets serial port programs written for either Windows or Unix
# work on the other kind of system without modification.
# By Ned Konz, ned@bike-nomad.com, http://bike-nomad.com
# This script must have only LF line endings to work cross-platform.
# usage:
#  perl -MAnySerialPort myProgram.pl
#
# This will map port names between Linux and Windows; if your system doesn't
# use the same mappings, you can call
# Device::SerialPort::mapPorts
# or
# Win32::SerialPort::mapPorts
# to change it:
# Device::SerialPort->mapPorts('COM1:' => '/dev/magicSerial0',
#         'COM2' => '/dev/magicSerial1');
16
package FIJI::AnySerialPort;
Stefan Tauner's avatar
Stefan Tauner committed
17
18
19
use strict;
use vars '@ISA';

20
21
22
23
BEGIN {
    my %portMap;
    my $oldNew;
    my $onWindows = 0;
Stefan Tauner's avatar
Stefan Tauner committed
24

Christian Fibich's avatar
Christian Fibich committed
25
    if ($^O eq 'MSWin32')    # running on Win32
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    {
        $onWindows = 1;
        eval "use Win32::SerialPort";
        *main::Device::SerialPort::  = *main::Win32::SerialPort::;
        $oldNew                      = \&Win32::SerialPort::new;
        $INC{'Device/SerialPort.pm'} = $INC{'Win32/SerialPort.pm'};
        %portMap                     = (
            '/dev/ttyS0' => 'COM1:',
            '/dev/ttyS1' => 'COM2:',
            '/dev/ttyS2' => 'COM3:',
            '/dev/ttyS3' => 'COM4:',
        );
    } else    # running on Unix
    {
        eval "use Device::SerialPort";
        *main::Win32::SerialPort::  = *main::Device::SerialPort::;
        $oldNew                     = \&Device::SerialPort::new;
        $INC{'Win32/SerialPort.pm'} = $INC{'Device/SerialPort.pm'};
        %portMap                    = (
            'COM1:' => '/dev/ttyS0',
            'COM2:' => '/dev/ttyS1',
            'COM3:' => '/dev/ttyS2',
            'COM4:' => '/dev/ttyS3',
        );
    }
Stefan Tauner's avatar
Stefan Tauner committed
51

52
53
    die "$@\n" if $@;
    @ISA = 'Device::SerialPort';
Stefan Tauner's avatar
Stefan Tauner committed
54

55
56
57
58
59
    # Hook the constructor so we can map the port names
    # and class if needed
    *main::Device::SerialPort::new = sub {
        my $class    = shift;
        my $portName = shift;
Christian Fibich's avatar
Christian Fibich committed
60
        if ($onWindows != ($class eq 'Win32::SerialPort')) {
61
62
63
            $portName = $portMap{$portName} || $portName;
            $class = $onWindows ? 'Win32::SerialPort' : 'Device::SerialPort';
        }
Christian Fibich's avatar
Christian Fibich committed
64
        $oldNew->($class, $portName, @_);
65
    };
Stefan Tauner's avatar
Stefan Tauner committed
66

67
68
69
70
    # Gets and/or modifies the port mapping
    # Returns a hash
    sub Device::SerialPort::mapPorts {
        my $self = shift;
Christian Fibich's avatar
Christian Fibich committed
71
        %portMap = (%portMap, @_);
72
    }
Stefan Tauner's avatar
Stefan Tauner committed
73
74
75
}

1;