1717// whose radius is the eye radius minus the pupil radius.
1818#define INNER_RADIUS (EYE_RADIUS - PUPIL_RADIUS)
1919
20- #define TFT_CS 39 // Hallowing display control pins: chip select
21- #define TFT_RST 37 // Display reset
22- #define TFT_DC 38 // Display data/command select
23- #define TFT_BACKLIGHT 7 // Display backlight pin
20+ #if defined(ADAFRUIT_HALLOWING)
21+ #define TFT_CS 39 // Hallowing display control pins: chip select
22+ #define TFT_RST 37 // Display reset
23+ #define TFT_DC 38 // Display data/command select
24+ #define TFT_BACKLIGHT 7 // Display backlight pin
25+ #define TFT_SPI SPI
26+ #define TFT_PERIPH PERIPH_SPI
27+ Adafruit_LIS3DH accel = Adafruit_LIS3DH();
28+ #elif defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS)
29+ #define TFT_CS A7 // Display select
30+ #define TFT_DC A6 // Display data/command pin
31+ #define TFT_RST -1 // Display reset pin
32+ #define TFT_BACKLIGHT A3
33+ #define TFT_PERIPH PERIPH_SPI1
34+ #define TFT_SPI SPI1
35+ Adafruit_LIS3DH accel (&Wire1);
36+ #endif
2437
2538// For the sake of math comprehension and simplicity, movement takes place
2639// in a traditional Cartesian coordinate system (+Y is up), floating point
@@ -34,8 +47,8 @@ bool firstFrame = true; // Force full-screen update on initial frame
3447
3548// Declarations for various Hallowing hardware -- display, accelerometer
3649// and SPI rate & mode.
37- Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
38- Adafruit_LIS3DH accel = Adafruit_LIS3DH();
50+ Adafruit_ST7735 tft = Adafruit_ST7735(&TFT_SPI, TFT_CS, TFT_DC, TFT_RST);
51+
3952SPISettings settings (12000000 , MSBFIRST, SPI_MODE0);
4053
4154// Declarations related to DMA (direct memory access), which lets us walk
@@ -72,31 +85,31 @@ void setup(void) {
7285 int dmac_id;
7386 volatile uint32_t *data_reg;
7487 dma.allocate ();
75- if (&PERIPH_SPI == &sercom0) {
88+ if (&TFT_PERIPH == &sercom0) {
7689 dma.setTrigger (SERCOM0_DMAC_ID_TX);
7790 data_reg = &SERCOM0->SPI .DATA .reg ;
7891#if defined SERCOM1
79- } else if (&PERIPH_SPI == &sercom1) {
92+ } else if (&TFT_PERIPH == &sercom1) {
8093 dma.setTrigger (SERCOM1_DMAC_ID_TX);
8194 data_reg = &SERCOM1->SPI .DATA .reg ;
8295#endif
8396#if defined SERCOM2
84- } else if (&PERIPH_SPI == &sercom2) {
97+ } else if (&TFT_PERIPH == &sercom2) {
8598 dma.setTrigger (SERCOM2_DMAC_ID_TX);
8699 data_reg = &SERCOM2->SPI .DATA .reg ;
87100#endif
88101#if defined SERCOM3
89- } else if (&PERIPH_SPI == &sercom3) {
102+ } else if (&TFT_PERIPH == &sercom3) {
90103 dma.setTrigger (SERCOM3_DMAC_ID_TX);
91104 data_reg = &SERCOM3->SPI .DATA .reg ;
92105#endif
93106#if defined SERCOM4
94- } else if (&PERIPH_SPI == &sercom4) {
107+ } else if (&TFT_PERIPH == &sercom4) {
95108 dma.setTrigger (SERCOM4_DMAC_ID_TX);
96109 data_reg = &SERCOM4->SPI .DATA .reg ;
97110#endif
98111#if defined SERCOM5
99- } else if (&PERIPH_SPI == &sercom5) {
112+ } else if (&TFT_PERIPH == &sercom5) {
100113 dma.setTrigger (SERCOM5_DMAC_ID_TX);
101114 data_reg = &SERCOM5->SPI .DATA .reg ;
102115#endif
@@ -134,6 +147,13 @@ void loop(void) {
134147 float ax = accel.y_g * scale, // Horizontal acceleration, pixel units
135148 ay = accel.x_g * scale; // Vertical acceleration "
136149
150+ #if defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS)
151+ // CPX has different accel orientations
152+ float temp = ay;
153+ ay = ax;
154+ ax = -temp;
155+ #endif
156+
137157 // Add scaled accelerometer readings to pupil velocity, store interim
138158 // values in vxNew, vyNew...a little friction prevents infinite bounce.
139159 float vxNew = (vx + ax) * DRAG,
@@ -272,7 +292,7 @@ void loop(void) {
272292 if (x2 > 127 ) x2 = 127 ;
273293 if (y2 > 127 ) y2 = 127 ;
274294
275- SPI .beginTransaction (settings); // SPI init
295+ TFT_SPI .beginTransaction (settings); // SPI init
276296 digitalWrite (TFT_CS, LOW); // Chip select
277297 tft.setAddrWindow (x1, y1, x2-x1+1 , y2-y1+1 );
278298 digitalWrite (TFT_CS, LOW); // Re-select after addr function
@@ -398,7 +418,7 @@ void loop(void) {
398418
399419 while (dma_busy); // Wait for last DMA transfer to complete
400420 digitalWrite (TFT_CS, HIGH); // Deselect
401- SPI .endTransaction (); // SPI done
421+ TFT_SPI .endTransaction (); // SPI done
402422}
403423
404424void dmaXfer (uint16_t n) { // n = Transfer size in bytes
0 commit comments