def testEq(self): a = LightState([0, 1, 0, 1, 0, 1, 0, 1]) b = LightState([0, 1, 0, 1, 0, 1, 0, 1]) c = LightState([0, 1, 0, 1, 0, 1, 0, 0]) self.assertEqual(a, b) self.assertNotEqual(a, c) self.assertNotEqual(b, c)
def testInvert(self): a = LightState([1, 1, 1, 1, 1, 1, 1, 1]) b = LightState([0, 0, 0, 0, 0, 0, 0, 0]) c = LightState([1, 0, 1, 0, 0, 1, 0, 0]) d = ~a self.assertEqual(d._values, [0, 0, 0, 0, 0, 0, 0, 0]) d = ~b self.assertEqual(d._values, [1, 1, 1, 1, 1, 1, 1, 1]) d = ~c self.assertEqual(d._values, [0, 1, 0, 1, 1, 0, 1, 1])
def testXor(self): a = LightState([1, 1, 1, 1, 1, 1, 1, 1]) b = LightState([0, 0, 0, 0, 0, 0, 0, 0]) c = LightState([1, 0, 1, 0, 0, 1, 0, 0]) d = a ^ b self.assertEqual(d._values, [1, 1, 1, 1, 1, 1, 1, 1]) d = b ^ c self.assertEqual(d._values, [1, 0, 1, 0, 0, 1, 0, 0]) d = c ^ a self.assertEqual(d._values, [0, 1, 0, 1, 1, 0, 1, 1])
def testOr(self): a = LightState([1, 1, 1, 1, 1, 1, 1, 1]) b = LightState([0, 0, 0, 0, 0, 0, 0, 0]) c = LightState([1, 0, 1, 0, 0, 1, 0, 0]) d = a | b self.assertEqual(d._values, [1, 1, 1, 1, 1, 1, 1, 1]) d = b | c self.assertEqual(d._values, [1, 0, 1, 0, 0, 1, 0, 0]) d = c | a self.assertEqual(d._values, [1, 1, 1, 1, 1, 1, 1, 1])
def testAnd(self): a = LightState([1, 1, 1, 1, 1, 1, 1, 1]) b = LightState([0, 0, 0, 0, 0, 0, 0, 0]) c = LightState([1, 0, 1, 0, 0, 1, 0, 0]) d = a & b self.assertEqual(d._values, [0, 0, 0, 0, 0, 0, 0, 0]) d = b & c self.assertEqual(d._values, [0, 0, 0, 0, 0, 0, 0, 0]) d = c & a self.assertEqual(d._values, [1, 0, 1, 0, 0, 1, 0, 0])
class LightHardware(object): def __init__(self): self._values = LightState() @property def values(self): return self._values @values.setter def values(self, values): """ Set values """ changes = self._values.diff(values) self._values = values self.updateValues(self._values) for lightId in changes: self.updateValue(lightId, changes[lightId]) @abc.abstractmethod def updateValue(self, lightId, value): """ Send updated light value to the hardware """ pass @abc.abstractmethod def updateValues(self, values): """ Display updated values to the user (for testing) """ pass
def testShiftLeft(self): # Move one place a = LightState([0, 0, 0, 1, 0, 0, 0, 0]) b = a << 1 self.assertEqual(b._values, [0, 0, 1, 0, 0, 0, 0, 0]) # Two places b = a << 2 self.assertEqual(b._values, [0, 1, 0, 0, 0, 0, 0, 0]) # Wrapping b = a << 4 self.assertEqual(b._values, [0, 0, 0, 0, 0, 0, 0, 1]) # Handling numbers > 8 b = a << 12 self.assertEqual(b._values, [0, 0, 0, 0, 0, 0, 0, 1])
def run(self): # Set up liter and delay self.liter.values = LightState.clear() delay = 1.0 / self.frameRate while not self._shutdown: try: a = self.animQueue.get(True, delay) if self._skip and not self.animQueue.empty(): continue self._skip = False for i in a(): self.liter.values = i if self._shutdown or self._skip: break time.sleep(delay) except queue.Empty: if self._shutdownWhenComplete: self._shutdown = True continue self._shutdown = True
def run(self): # Set up liter and delay self.liter.values = LightState.clear() delay = 1.0 / self.frameRate; while not self._shutdown: try: a = self.animQueue.get(True, delay) if self._skip and not self.animQueue.empty(): continue self._skip = False for i in a(): self.liter.values = i if self._shutdown or self._skip: break; time.sleep(delay) except queue.Empty: if self._shutdownWhenComplete: self._shutdown = True continue self._shutdown = True
def __init__(self): self._values = LightState()
def frames(self): for i in range(0, self.a): yield LightState.bar(math.sin(i / 5.0) / 2.0 + 0.5)