diff --git a/src/controllerSoftware/templates/index.html b/src/controllerSoftware/templates/index.html new file mode 100644 index 0000000..93716a1 --- /dev/null +++ b/src/controllerSoftware/templates/index.html @@ -0,0 +1,333 @@ + + + + RGB Lamp Matrix Control + + + + + +
+

RGB Lamp Matrix Control

+
+ + + + + + +
+
+ {% for row in range(5) %} + {% for col in range(5) %} +
+ {% endfor %} + {% endfor %} +
+ +
+
+

Center Lamp

+
+ Red + + Green + + Blue + +
+
+ +
+
+ Region Red + + Region Green + + Region Blue + +
+
+
+
+ + \ No newline at end of file diff --git a/src/controllerSoftware/web.py b/src/controllerSoftware/web.py new file mode 100644 index 0000000..3708774 --- /dev/null +++ b/src/controllerSoftware/web.py @@ -0,0 +1,129 @@ +from flask import Flask, render_template, request, jsonify + +# ... (paste the two helper functions here if they are not already present) ... + +app = Flask(__name__) + +def create_spiral_map(n=5): + """ + Creates a pre-computed spiral mapping for an n x n matrix. + The spiral starts from the center and moves outwards. + + Args: + n (int): The size of the square matrix. + + Returns: + list of lists: A 2D list where each element is the spiraling address. + """ + if n % 2 == 0: + raise ValueError("Matrix size must be odd for a unique center point.") + + spiral_map = [[0] * n for _ in range(n)] + + # Starting position and index + r, c = n // 2, n // 2 + address = 0 + spiral_map[r][c] = address + + # Directions: Right, Down, Left, Up + dr = [0, 1, 0, -1] + dc = [1, 0, -1, 0] + direction = 0 + + segment_length = 1 + steps = 0 + + while address < n * n - 1: + for _ in range(segment_length): + address += 1 + r += dr[direction] + c += dc[direction] + if 0 <= r < n and 0 <= c < n: + spiral_map[r][c] = address + + direction = (direction + 1) % 4 + steps += 1 + + # Increase segment length after every two turns + if steps % 2 == 0: + segment_length += 1 + + return spiral_map + +def get_spiral_address(row, col, spiral_map): + """ + Converts a standard (row, col) address to a spiraling address + using a pre-computed map. + + Args: + row (int): The row index (0-indexed). + col (int): The column index (0-indexed). + spiral_map (list of lists): The pre-computed spiral map. + + Returns: + int: The spiraling address, or -1 if the coordinates are out of bounds. + """ + n = len(spiral_map) + if 0 <= row < n and 0 <= col < n: + return spiral_map[row][col] + else: + return -1 + +# Pre-compute the spiral map for a 5x5 matrix when the app starts +SPIRAL_MAP_5x5 = create_spiral_map(5) + +# Initialize a 5x5 matrix with all lamps off (black color code) +lamp_matrix = [['#000000' for _ in range(5)] for _ in range(5)] + +# Define a helper function to convert hex to RGB for template use +def hex_to_rgb(hex_color): + hex_color = hex_color.lstrip('#') + return { + 'r': int(hex_color[0:2], 16), + 'g': int(hex_color[2:4], 16), + 'b': int(hex_color[4:6], 16) + } + +app.jinja_env.globals.update(hex_to_rgb=hex_to_rgb) + +@app.route('/') +def index(): + """ + Renders the main control interface for the RGB lamp matrix. + """ + return render_template('index.html', matrix=lamp_matrix) + +@app.route('/set_color', methods=['POST']) +def set_color(): + """ + Sets the color for multiple lamps and turns all others black. + """ + data = request.get_json() + lamps_to_update = data.get('lamps', []) + r = data.get('r') + g = data.get('g') + b = data.get('b') + + try: + r, g, b = int(r), int(g), int(b) + new_color = '#{:02x}{:02x}{:02x}'.format(r, g, b) + + # First, turn all lamps black + for row in range(5): + for col in range(5): + lamp_matrix[row][col] = '#000000' + + # Then, apply the new color to the selected lamps + for lamp in lamps_to_update: + row = lamp['row'] + col = lamp['col'] + if 0 <= row < 5 and 0 <= col < 5: + lamp_matrix[row][col] = new_color + + return jsonify(success=True, new_color=new_color) + + except (ValueError, TypeError, IndexError): + return jsonify(success=False, message="Invalid data received") + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file