475319ca1227ed9aa92251f3b4d3497ffea55212
[Arduino] / c2_ulx3s_test / c2_ulx3s_test.ino
1 #include <Compositing.h>
2 #include "font.h"
3 #include "rtc.h"
4 #include "adc.h"
5 #include "dac.h"
6 #include "edid.h"
7 #include "btn.h"
8 #include "flash.h"
9 #include "sd.h"
10 #include "oled.h"
11 #include "ram.h"
12 #include "rds.h"
13 #include "pcm.h"
14
15 #define N_LETTERS (sizeof(Font)/sizeof(Font[0]))
16
17 Compositing c2;
18
19 const int Cols = 40;
20 const int Rows = 30;
21 int Cursor_col = 0, Cursor_row = 0;
22
23 void cls()
24 {
25   for(int row = 0; row < Rows; row++)
26     for(int col = 0; col < Cols; col++)
27     {
28       int i = N_LETTERS + row*Cols + col;
29       c2.sprite_link_content('@'-'@', i);
30     }
31   Cursor_col = Cursor_row = 0;
32 }
33
34 void prints(char *a)
35 {
36   for(;*a != '\0'; a++)
37   {
38     int i = N_LETTERS + Cursor_row*Cols + Cursor_col;
39     uint8_t letter = 0; // space is default
40     char c = *a;
41     if(c == '\n')
42     {
43       Cursor_col = 0;
44       Cursor_row = (Cursor_row + 1) % Rows;
45       continue;
46     }
47     c = toupper(c);
48     if(c >= ' ' && c <= '_')
49       letter = c - ' ';
50     c2.sprite_link_content(letter, i);
51     if(++Cursor_col >= Cols)
52     {
53       Cursor_col = 0;
54       Cursor_row = (Cursor_row + 1) % Rows;
55     }
56   }  
57 }
58
59 // initialize compositing2 text using sprites
60 void video_init()
61 {
62   int i;
63   int unique_sprites;
64   c2.init();
65   c2.alloc_sprites(N_LETTERS+Rows*Cols); // it sets c2.sprite_max
66   *c2.videobase_reg = NULL; // disable video during update
67   *c2.cntrl_reg = 0;
68   #if 1
69     for(i = 0; i < c2.sprite_max && i < N_LETTERS; i++)
70       c2.shape_to_sprite(&(Font[i]));
71     unique_sprites = c2.n_sprites;
72     // unique sprites containing alphabet are not displayed, set them off-screen
73     for(i = 0; i < unique_sprites; i++)
74     {
75       c2.Sprite[i]->x = -100;
76       c2.Sprite[i]->y = -100;
77     }
78     // position cloned sprites on display
79     // i = N_LETTERS;
80     for(int row = 0; row < Rows; row++)
81       for(int col = 0; col < Cols; col++)
82     {
83       c2.sprite_clone(0); // by default clone 0-sprite which is space
84       int n = N_LETTERS + row*Cols + col;
85       c2.Sprite[n]->x = col*16;
86       c2.Sprite[n]->y = row*16;
87       i++;
88     }
89   #endif
90   // cls();
91   c2.sprite_refresh();
92   // this is needed for vgatext
93   // to disable textmode and enable bitmap
94   *c2.cntrl_reg = 0b11000000; // enable video, yes bitmap, no text mode, no cursor
95 }
96
97 void setup()
98 {
99   Serial.println("setup start");
100   video_init();
101   rtc_init();
102   adc_init();
103   dac_init();
104   btn_init();
105   oled_init();
106   rds_init();
107   pcm_init();
108   rtc_set_clock();
109   rtc_set_alarm();
110   Serial.println("setup end");
111 }
112
113 int rtc_ok = 0;
114 int edid_ok = 0;
115 int adc_ok = 0;
116 int dac_ok = 0;
117 int btn_ok = 0;
118 int flash_ok = 0;
119 int sd_ok = 0;
120
121 int all_ok = 0;
122 int last_all_ok = -1;
123
124 int led_beat = 0;
125
126
127 void loop()
128 {
129   static uint8_t counter = 0;
130   const int nlines = 6;
131   char line[nlines][256];
132
133   digitalWrite(8+7, led_beat);
134   led_beat = !led_beat;
135
136 #if 0
137   if(1 & ++counter)
138     pcm_tone();
139   else
140     pcm_mute();
141 #endif
142
143   if ( rtc_ok == 0 ) rtc_ok = rtc_read(line[0]);
144   if ( rtc_ok == 1 ) {
145     Serial.println("RTC OK");
146     rtc_ok++;
147     all_ok++;
148   }
149   if ( edid_ok == 0 ) edid_ok = edid_read(line[1]);
150   if ( edid_ok == 1 ) {
151     Serial.println("EDID OK");
152     edid_ok++;
153     all_ok++;
154   }
155   if ( adc_ok < 8 ) adc_ok = adc_read(line[2]);
156   if ( adc_ok == 8 ) {
157     Serial.println("ADC OK");
158     adc_ok++;
159     all_ok++;
160   }
161   if ( dac_ok == 0 ) dac_ok = dac_read(line[3]);
162   if ( dac_ok == 1 ) {
163     Serial.println("DAC OK");
164     dac_ok++;
165     all_ok++;
166   }
167   
168   int btn = btn_read(line[4]); // buttons. DIP switches and blink LEDs
169   if ( btn_ok == 0 && btn == 7 ) {
170     Serial.println("BTN OK");
171     btn_ok++;
172     all_ok++;
173   }
174
175 #if 0
176   if(line[4][5] == '1') // BTN1 pressed
177   {
178     rtc_set_clock();
179     rtc_set_alarm();
180     oled_init();
181   }
182   if(line[4][6] == '2') // BTN2 pressed - shutdown
183   {
184     volatile uint32_t *simple_out = (uint32_t *)0xFFFFFF10;
185     simple_out[0] |= (1<<13); // bit 13 of simple_out is shutdown
186   }
187 #endif
188   char flash_str[64], sd_str[64], oled_str[64];
189   if ( flash_ok == 0 ) flash_ok = flash_read(flash_str);
190   if ( flash_ok == 1 ) {
191     Serial.println("FLASH OK");
192     flash_ok++;
193     all_ok++;
194   }
195   
196   if ( sd_ok == 0 ) sd_ok = sd_read(sd_str); // esp32 must be flashed not to access SD card
197   if ( sd_ok == 1 ) {
198     Serial.println("SD OK");
199     sd_ok++;
200     all_ok++;
201   }
202
203 #if 0
204   oled_read(oled_str);
205 #endif
206
207   Serial.print("all_ok=");
208   Serial.println(all_ok);
209
210   sprintf(line[5], "%s %s   %s\n", flash_str, oled_str, sd_str);
211   line[6][0]='\0';
212   //ram_test(line[5]); // works but too slow, need speedup
213   Serial.println("");
214   for(int i = 0; i < nlines; i++)
215     Serial.print(line[i]);
216
217   cls();
218   for(int i = 0; i < nlines; i++)
219     prints(line[i]);
220   
221   while((*c2.vblank_reg & 0x80) == 0);
222   c2.sprite_refresh();
223   // delay(1000);
224 }