From 3d098bd8066f301f3baf4e1395bfb6da87a34028 Mon Sep 17 00:00:00 2001 From: unlockable Date: Fri, 25 Aug 2023 13:38:44 +0800 Subject: [PATCH] draw_line. --- 8By8/8By8.ino | 97 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 27 deletions(-) diff --git a/8By8/8By8.ino b/8By8/8By8.ino index 800c7e7..7426736 100644 --- a/8By8/8By8.ino +++ b/8By8/8By8.ino @@ -24,14 +24,16 @@ public: brightness_count = (brightness_count + 1) % 3; for (int i = 0; i < 8; i++) { - for (int j = 0; j < 8; j++) { - // In LED_status: - // 0 = off - // 4 = brightest - digitalWrite(BUS_START_PIN + j, ((LED_status[layer_count][i] >> (j * 2)) & 3) >= (3 - brightness_count)); - } - digitalWrite(CLOCK_START_PIN + i, HIGH); - digitalWrite(CLOCK_START_PIN + i, LOW); + for (int j = 0; j < 8; j++) { + // In LED_status: + // 0 = off + // 4 = brightest + digitalWrite(BUS_START_PIN + j, + ((LED_status[layer_count][i] >> (j * 2)) & 3) >= + (3 - brightness_count)); + } + digitalWrite(CLOCK_START_PIN + i, HIGH); + digitalWrite(CLOCK_START_PIN + i, LOW); } digitalWrite(SW_START_PIN + layer_count, HIGH); @@ -39,10 +41,52 @@ public: static void set_status(int x, int y, int z, int brightness) { if (x >= 8 || x < 0 || y >= 8 || y < 0 || z >= 8 || z < 0) { - return; + return; } brightness %= 4; - LED_status[z][x] = (LED_status[z][x] & (~(3 << (y * 2)))) | (brightness << (y * 2)); + LED_status[z][x] = + (LED_status[z][x] & (~(3 << (y * 2)))) | (brightness << (y * 2)); + } + + static int get_status(int x, int y, int z) { + return LED_status[z][x] >> (y * 2) & 3; + } + + static void clear() { + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + LED_status[i][j] = 0; + } + } + } + + static void draw_line(int x, int y, int z, int length, int direction, int brightness) { + if (x >=8 || x < 0 || y >=8 || y < 0 || z >= 8 || z < 0) { + return; + } + if (direction >= 3 || direction < 0 || length <= 0 || brightness >= 4 || brightness < 0) { + return; + } + // 0: x + // 1: y + // 2: z + switch (direction) { + case 0: + for (int i = 0; i < length; i++) { + set_status(x + i, y, z, brightness); + } + break; + case 1: + for (int i = 0; i < length; i++) { + set_status(x, y + i, z, brightness); + } + break; + case 2: + for (int i = 0; i < length; i++) { + set_status(x, y, z + i, brightness); + } + break; + } } }; @@ -52,27 +96,26 @@ int Cube::LED_status[8][8] = {0}; int bright = 3; void setup() { - for (int i = 22; i < 46; i++) { - pinMode(i, OUTPUT); - } + for (int i = 22; i < 46; i++) { + pinMode(i, OUTPUT); + } - Timer1.initialize(); - Timer1.setPeriod(TIME_PER_LAYER_IN_US); - Timer1.attachInterrupt(Cube::display); - - Serial.begin(115200); + Timer1.initialize(); + Timer1.setPeriod(TIME_PER_LAYER_IN_US); + Timer1.attachInterrupt(Cube::display); + Serial.begin(115200); } void loop() { - - for (int i = 7; i >= 0; i--) { - for (int j = 0; j < 8; j++) { - for (int k = 0; k < 8; k++) { - Cube::set_status(i, j, k, bright); - delay(5); - } - } + + for (int i = 7; i >= 0; i--) { + for (int j = 0; j < 8; j++) { + for (int k = 0; k < 8; k++) { + Cube::set_status(i, j, k, bright); + delay(5); + } } - bright = (bright + 1) % 4; + } + bright = (bright + 1) % 4; } \ No newline at end of file