import zmq import json import copy class Matrix: "Leds matrix" def __init__(self): "Establish connection to matrix" self.width = 12 self.height = 10 self.__mat__ = [None]*10 for x in range(10): self.__mat__[x] = [None]*12 for y in range(12): self.__mat__[x][y] = '000000' self.context = zmq.Context() self.socket = self.context.socket(zmq.PUB) self.socket.bind('tcp://*:4444') def display(self): "Display matrix to leds" for i in range(0, 10): self.socket.send_string('line' + str(i) + ' ' + json.dumps(self.__mat__[i])) def pixel(self, x, y, color): "Set pixel in matrix" if x < 0 or x > 11 or y < 0 or y > 9: raise Exception('Pixel out of matrix') self.__mat__[y][x] = color def fill(self, color): "Fill whole matrix with given color" for x in range(self.width): for y in range(self.height): self.pixel(x, y, color) def set_matrix(self, matrix): "Set given matrix as matrix" for x in range(self.width): for y in range(self.height): self.pixel(x, y, matrix[y][x]) def copy_matrix(self): "Return copy of current matrix" return copy.deepcopy(self.__mat__) def matrix_diff(self, matrix): """ Returns set of changes in matrix Every item in set is dictionary with following items: x: X position of led y: Y position of led color: string defining color of given led """ change = list() for x in range(self.width): for y in range(self.height): if matrix[y][x] != self.__mat__[y][x]: change.append({ 'x': x, 'y': y, 'color': self.__mat__[y][x] }) return change def matrix_apply_diff(self, diff): "Apply diff generated by matrix_diff" for change in diff: self.pixel(change['x'], change['y'], change['color'])