]> Git Repo - pov-display-rpi.git/blob - src/display.c
works with 6 chips now, i did oops
[pov-display-rpi.git] / src / display.c
1 #include "common.h"
2 #include "spi.h"
3 #include "tlc59711.h"
4 #include "GPIO.h"
5 #include "display.h"
6 #include <time.h>
7
8 inline static int readPin()
9 {
10     return GPIORead(0);
11 }
12 static uint64_t nanos()
13 {
14     struct timespec now;
15     timespec_get(&now, TIME_UTC);
16     return ((uint64_t)now.tv_sec) * 1000000000 + ((uint64_t)now.tv_nsec);
17 }
18
19 static uint16_t pwmbuffer[chips][12];
20
21 static void lines(uint16_t data[chips][12]);
22
23 static void getDelay(uint64_t *delay, uint64_t *last);
24
25 extern void display(bool *go, const uint16_t lester[3][degreesIn][chips * 12], bool *swap)
26 {
27     GPIOInit();
28     GPIOPinmode(0, IN);
29     tlc59711_init("/dev/spidev0.1");
30     uint64_t delay = 0, last = 0;
31     bool went_back = true;
32     int p = 0;
33     while (*go)
34     { // main loop
35         for (int deg = 0; deg < degreesIn; deg++)
36         { // go thorugh degrees
37             while (last + ((delay)*deg) > nanos())
38             { // sleep between lines
39                 if (readPin())
40                     went_back = true;        // we can now wait for the next edge
41                 if (!readPin() && went_back) // we are still in the loop but we need to exit
42                     goto end;
43             } // sleep between lines
44             for (uint8_t i = 0; i < chips * 12; i++)
45             {
46                 pwmbuffer[i / 12][11 - (i % 12)] = lester[p][deg][i];
47             }
48             lines(pwmbuffer);
49         }
50     end:
51         while (readPin())
52             ; // wait till it goes low if we exited the loop early
53         getDelay(&delay, &last);
54         went_back = false; //make shure we trigger on the rising edge
55         printf("%llu\n", delay);
56         if (p == 2)
57             p = 0;
58         else
59             p++;
60         *swap = true;
61     }
62 }
63 static void getDelay(uint64_t *delay, uint64_t *last)
64 {
65     uint64_t tmp = *last;
66     *last = nanos();
67     *delay = (*last - tmp) / degreesIn;
68 }
69 static void lines(uint16_t line[chips][12])
70 {
71     uint8_t *data = (uint8_t *)malloc(chips * 28);
72     for (int i = 0; i < chips; i++)
73         tlc59711_create(line[i], data + (28 * i));
74     transfer(data, NULL, chips * 28);
75 }
This page took 0.026787 seconds and 4 git commands to generate.