summaryrefslogtreecommitdiff
path: root/pyparallel/parallel/parallelutil.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyparallel/parallel/parallelutil.py')
-rw-r--r--pyparallel/parallel/parallelutil.py124
1 files changed, 0 insertions, 124 deletions
diff --git a/pyparallel/parallel/parallelutil.py b/pyparallel/parallel/parallelutil.py
deleted file mode 100644
index a1a262a..0000000
--- a/pyparallel/parallel/parallelutil.py
+++ /dev/null
@@ -1,124 +0,0 @@
-class BitaccessMeta(type):
- """meta class that adds bit access properties to a
- parallel port implementation"""
-
- def __new__(self, classname, bases, classdict):
- klass = type.__new__(self, classname, bases, classdict)
- #status lines
- klass.paperOut = property(klass.getInPaperOut, None, "Read the PaperOut signal")
- #control lines
- klass.dataStrobe = property(None, klass.setDataStrobe, "Set the DataStrobe signal")
- #XXX ... other bits
- #data bits
- for bit in range(8):
- mask = (1<<bit)
- def getter(self, mask=mask):
- return (self.getData() & mask) != 0
- def setter(self, b, mask=mask):
- if b:
- self.setData(self.getData() | mask)
- else:
- self.setData(self.getData() & ~mask)
- setattr(klass, "D%d" % bit, property(getter, setter, "Access databit %d" % bit))
- #nibbles
- for name, shift, width in [('D0_D3', 0, 4), ('D4_D7', 4, 4)]:
- mask = (1<<width) - 1
- def getter(self, shift=shift, mask=mask):
- return (self.getData() >> shift) & mask
- def setter(self, b, shift=shift, mask=mask):
- self.setData((self.getData() & ~(mask<<shift)) | ((b&mask) << shift))
- setattr(klass, name, property(getter, setter, "Access to %s" % name))
- return klass
-
-class VirtualParallelPort:
- """provides a virtual parallel port implementation, useful
- for tests and simulations without real hardware"""
-
- __metaclass__ = BitaccessMeta
-
- def __init__(self, port=None):
- self._data = 0
-
- def setData(self, value):
- self._data = value
-
- def getData(self):
- return self._data
-
- #inputs return dummy value
- def getInPaperOut(self): return self._dummy
- #...
- #outputs just store a tuple with (action, value) pair
- def setDataStrobe(self, value): self._last = ('setDataStrobe', value)
- #...
-
-#testing
-if __name__ == '__main__':
- import unittest, sys
-
- class TestBitaccess(unittest.TestCase):
- """Tests a port with no timeout"""
- def setUp(self):
- self.p = VirtualParallelPort()
-
- def testDatabits(self):
- """bit by bit D0..D7"""
- p = self.p
- p.D0 = p.D2 = p.D4 = p.D6 = 1
- self.failUnlessEqual(p._data, 0x55)
- self.failUnlessEqual(
- [p.D7, p.D6, p.D5, p.D4, p.D3, p.D2, p.D1, p.D0],
- [0, 1, 0, 1, 0, 1, 0, 1]
- )
- p._data <<= 1
- self.failUnlessEqual(
- [p.D7, p.D6, p.D5, p.D4, p.D3, p.D2, p.D1, p.D0],
- [1, 0, 1, 0, 1, 0, 1, 0]
- )
-
- def testDatabitsGroups(self):
- """nibbles D0..D7"""
- p = self.p
- p.D0_D3 = 14
- self.failUnlessEqual(p._data, 0x0e)
- p.D0_D3 = 0
- p.D4_D7 = 13
- self.failUnlessEqual(p._data, 0xd0)
- p.D0_D3 = p.D4_D7 = 0xa
- self.failUnlessEqual(p._data, 0xaa)
- #test bit patterns
- for x in range(256):
- #test getting
- p._data = x
- self.failUnlessEqual((p.D4_D7, p.D0_D3), (((x>>4) & 0xf), (x & 0xf)))
- #test setting
- p._data = 0
- (p.D4_D7, p.D0_D3) = (((x>>4) & 0xf), (x & 0xf))
- self.failUnlessEqual(p._data, x)
-
- def testStatusbits(self):
- """bit by bit status lines"""
- #read the property:
- self.p._dummy = 0
- self.failUnlessEqual(self.p.paperOut, 0)
-
- self.p._dummy = 1
- self.failUnlessEqual(self.p.paperOut, 1)
-
- #read only, must not be writable:
- self.failUnlessRaises(AttributeError, setattr, self.p, 'paperOut', 1)
-
- def testControlbits(self):
- """bit by bit control lines"""
- self.p.dataStrobe = 0
- self.failUnlessEqual(self.p._last, ('setDataStrobe', 0))
- self.p.dataStrobe = 1
- self.failUnlessEqual(self.p._last, ('setDataStrobe', 1))
-
- #write only, must not be writable:
- self.failUnlessRaises(AttributeError, getattr, self.p, 'dataStrobe')
-
- sys.argv.append('-v')
- # When this module is executed from the command-line, it runs all its tests
- unittest.main()
- \ No newline at end of file