summaryrefslogtreecommitdiff
path: root/src/draw.c
diff options
context:
space:
mode:
authorvmisovic <vladimir.misovic03@gmail.com>2023-02-21 13:18:51 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-03-10 23:48:43 +0100
commitf6ebc8903c51435cccfc95915f75d96f73f16fa7 (patch)
tree2782af11a61f1f3f828d568019174d67a9fed26f /src/draw.c
parent30a0aafd0feb6615b17bd226ba82010a6aaeb20b (diff)
vmisovic: code organization, drawing letters
source files moved to 'src' folder program divided into multiple files drawing letters aleksav013: fixed vmisovic commits moved functions from .h to .c file renamed led_cube.c to main.c
Diffstat (limited to 'src/draw.c')
-rw-r--r--src/draw.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/draw.c b/src/draw.c
new file mode 100644
index 0000000..a927e9c
--- /dev/null
+++ b/src/draw.c
@@ -0,0 +1,52 @@
+#include "draw.h"
+#include "config.h"
+#include <string.h>
+
+void send_raw_data(uint8_t data[9])
+{
+ gpio_put(LATCH_PIN, 0);
+ for (size_t i = 0; i < 9; i++) {
+ for (size_t j = 0; j < 8; j++)
+ {
+ gpio_put(DATA_PIN, data[map[i]] & (1 << j));
+ gpio_put(CLOCK_PIN, 0);
+ gpio_put(CLOCK_PIN, 1);
+ }
+ }
+ gpio_put(LATCH_PIN, 1);
+}
+
+void send_data(uint8_t floor, uint64_t on_floor)
+{
+ uint8_t data[9];
+ data[0] = floor;
+ memcpy(&data[1], &on_floor, 8);
+ send_raw_data(data);
+}
+
+void cube_set_led(uint64_t data[8], uint8_t x, uint8_t y, uint8_t z, bool value)
+{
+ uint64_t mask = 1LL << (y * 8 + x);
+ if (value != (bool)(data[z] & mask))
+ data[z] ^= mask;
+}
+
+int64_t zero_byte(alarm_id_t id, void* user_data)
+{
+ memset(user_data, 0, 1);
+ return 0;
+}
+
+void draw(uint64_t data[8], uint32_t time)
+{
+ volatile uint8_t ind = 1;
+ add_alarm_in_ms(time, (void*)zero_byte, (void*)&ind, false);
+
+ while (ind) {
+ for (size_t i = 0; i < 8; i++) {
+ send_data((1 << i), data[i]);
+ sleep_ms(1);
+ }
+ tight_loop_contents();
+ }
+}