|
4 | 4 |
|
5 | 5 | By Paul Malmsten, 2010 |
6 | 6 | pmalmsten@gmail.com |
| 7 | +Updated by James Saunders, 2016 |
| 8 | +Inspired by code written by D. Thiebaut http://cs.smith.edu/dftwiki/index.php/PySerial_Simulator |
7 | 9 |
|
8 | 10 | Provides fake device objects for other unit tests. |
9 | 11 | """ |
10 | 12 | import sys |
11 | 13 |
|
12 | | -class FakeDevice(object): |
13 | | - """ |
14 | | - Represents a fake serial port for testing purposes |
15 | | - """ |
16 | | - def __init__(self): |
17 | | - self.data = b'' |
18 | | - |
19 | | - def write(self, data): |
| 14 | +class Serial(object): |
| 15 | + def __init__( self, port='/dev/null', baudrate = 19200, timeout=1, |
| 16 | + bytesize = 8, parity = 'N', stopbits = 1, xonxoff=0, |
| 17 | + rtscts = 0 ): |
20 | 18 | """ |
21 | | - Writes data to the fake port for later evaluation |
| 19 | + Init constructor, setup standard serial variables with default values. |
22 | 20 | """ |
23 | | - self.data = data |
| 21 | + self.name = port |
| 22 | + self.port = port |
| 23 | + self.timeout = timeout |
| 24 | + self.parity = parity |
| 25 | + self.baudrate = baudrate |
| 26 | + self.bytesize = bytesize |
| 27 | + self.stopbits = stopbits |
| 28 | + self.xonxoff = xonxoff |
| 29 | + self.rtscts = rtscts |
| 30 | + self._is_open = True |
24 | 31 |
|
25 | | -class FakeReadDevice(object): |
26 | | - """ |
27 | | - Represents a fake serial port which can be read from in a similar |
28 | | - fashion to the real thing |
29 | | - """ |
30 | | - |
31 | | - def __init__(self, data, silent_on_empty=False): |
32 | | - self.data = data |
33 | | - self.read_index = 0 |
34 | | - self.silent_on_empty = silent_on_empty |
35 | | - |
36 | | - def read(self, length=1): |
| 32 | + self._data_written = "" |
| 33 | + self._read_data = "" |
| 34 | + |
| 35 | + def isOpen( self ): |
37 | 36 | """ |
38 | | - Read the indicated number of bytes from the port |
| 37 | + Returns True if the serial port is open, otherwise False. |
39 | 38 | """ |
40 | | - # If too many bytes would be read, raise exception |
41 | | - if self.read_index + length > len(self.data): |
42 | | - if self.silent_on_empty: |
43 | | - sys.exit(0) |
44 | | - else: |
45 | | - raise ValueError("Not enough bytes exist!") |
46 | | - |
47 | | - read_data = self.data[self.read_index:self.read_index + length] |
48 | | - self.read_index += length |
49 | | - |
50 | | - return read_data |
| 39 | + return self._isOpen |
| 40 | + |
| 41 | + def open( self ): |
| 42 | + """ |
| 43 | + Open the serial port. |
| 44 | + """ |
| 45 | + self._is_open = True |
| 46 | + |
| 47 | + def close( self ): |
| 48 | + """ |
| 49 | + Close the serial port. |
| 50 | + """ |
| 51 | + self._is_open = False |
| 52 | + |
| 53 | + def write( self, data ): |
| 54 | + """ |
| 55 | + Write a string of characters to the serial port. |
| 56 | + """ |
| 57 | + self._data_written = data |
| 58 | + |
| 59 | + def read( self, len=1 ): |
| 60 | + """ |
| 61 | + Read the indicated number of bytes from the port. |
| 62 | + """ |
| 63 | + data = self._read_data[0:len] |
| 64 | + self._read_data = self._read_data[len:] |
| 65 | + return data |
| 66 | + |
| 67 | + def readline( self ): |
| 68 | + """ |
| 69 | + Read characters from the port until a '\n' (newline) is found. |
| 70 | + """ |
| 71 | + returnIndex = self._read_data.index( "\n" ) |
| 72 | + if returnIndex != -1: |
| 73 | + data = self._read_data[0:returnIndex+1] |
| 74 | + self._read_data = self._read_data[returnIndex+1:] |
| 75 | + return data |
| 76 | + else: |
| 77 | + return "" |
| 78 | + |
| 79 | + def inWaiting( self ): |
| 80 | + """ |
| 81 | + Returns the number of bytes available to be read. |
| 82 | + """ |
| 83 | + return len(self._read_data) |
| 84 | + |
| 85 | + def getSettingsDict( self ): |
| 86 | + """" |
| 87 | + Get a dictionary with port settings. |
| 88 | + """ |
| 89 | + settings = { |
| 90 | + 'timeout' : self.timeout, |
| 91 | + 'parity' : self.parity, |
| 92 | + 'baudrate' : self.baudrate, |
| 93 | + 'bytesize' : self.bytesize, |
| 94 | + 'stopbits' : self.stopbits, |
| 95 | + 'xonxoff' : self.xonxoff, |
| 96 | + 'rtscts' : self.rtscts |
| 97 | + } |
| 98 | + return settings |
| 99 | + |
| 100 | + def set_read_data( self, data ): |
| 101 | + """ |
| 102 | + Set fake data to be be returned by the read() and readline() functions. |
| 103 | + """ |
| 104 | + self._read_data = data |
| 105 | + |
| 106 | + def get_data_written( self ): |
| 107 | + """ |
| 108 | + Return record of data sent via the write command. |
| 109 | + """ |
| 110 | + return(self._data_written) |
| 111 | + |
| 112 | + def set_silent_on_empty( self, flag ): |
| 113 | + """ |
| 114 | + Set silent on error flag. If True do not error. |
| 115 | + """ |
| 116 | + self._silent_on_empty = flag |
51 | 117 |
|
52 | | - def inWaiting(self): |
| 118 | + def __str__( self ): |
53 | 119 | """ |
54 | | - Returns the number of bytes available to be read |
| 120 | + Returns a string representation of the serial class. |
55 | 121 | """ |
56 | | - return len(self.data) - self.read_index |
| 122 | + return "Serial<id=0xa81c10, open=%s>( port='%s', baudrate=%d," \ |
| 123 | + % ( str(self._is_open), self.port, self.baudrate ) \ |
| 124 | + + " bytesize=%d, parity='%s', stopbits=%d, xonxoff=%d, rtscts=%d)"\ |
| 125 | + % ( self.bytesize, self.parity, self.stopbits, self.xonxoff, |
| 126 | + self.rtscts ) |
0 commit comments