configureMax1112x();
}
-void adc_read(char *a)
+int adc_read(char *a)
{
+ int ret = 0;
static uint8_t skip_eval = 5; // skip evaluation for first few readings
static uint16_t reading[10], prev_reading[10];
// alternating LED state will also alternate
{
if(i & 1)
{
- if(reading[i] < ((i << 12) + 0x080) && prev_reading[i] > ((i << 12) + 0xF80) )
+ if(reading[i] < ((i << 12) + 0x080) && prev_reading[i] > ((i << 12) + 0xF80) ) {
channel_eval[i] = " OK ";
- else
+ ret++;
+ } else
channel_eval[i] = "FAIL";
}
else
{
- if(prev_reading[i] < ((i << 12) + 0x080) && reading[i] > ((i << 12) + 0xF80) )
+ if(prev_reading[i] < ((i << 12) + 0x080) && reading[i] > ((i << 12) + 0xF80) ) {
channel_eval[i] = " OK ";
- else
+ ret++;
+ } else
channel_eval[i] = "FAIL";
}
}
else
*gpio1_out |= gpio1_bits;
}
+ return ret;
}
void adc_init();
-void adc_read(char *a);
+int adc_read(char *a);
pinMode(i, OUTPUT);
}
-void btn_read(char *line)
+uint8_t btn[6];
+uint8_t btn_toggle[6] = { 0,0,0,0,0,0 };
+
+int btn_read(char *line)
{
+ int ret = 0;
static uint8_t shiftdata = 0;
uint8_t led = B10001 << (shiftdata++ & 3);
+
+ Serial.print("btn_toggle=");
+ for(int i=0; i<=6; i++) {
+ btn[i] = digitalRead(i);
+ if ( i == 0 ) btn[i] = !btn[i];
+ if ( btn[i] ) {
+ digitalWrite(8+i, 1);
+ if ( btn_toggle[i] == 0 ) {
+ btn_toggle[i]++; // press
+ }
+ } else {
+ digitalWrite(8+i, 0);
+ if ( btn_toggle[i] == 1 ) {
+ btn_toggle[i]++; // release
+ }
+ }
+ if (btn_toggle[i] == 2) {
+ ret++;
+ //digitalWrite(8+i, 1);
+ }
+ Serial.print(btn_toggle[i]);
+ }
+ Serial.println();
+
sprintf(line, "BTN:%c%c%c%c%c%c%c SW:%c%c%c%c LED:%c%c%c%c%c%c%c%c\n",
digitalRead(0) ? '_' : '0',
digitalRead(1) ? '1' : '_',
led & B00000010 ? '1' : '_',
led & B00000001 ? '0' : '_'
);
- for(int i = 0; i < 8; i++)
- digitalWrite(8+i, led & (1<<i) ? 1 : 0);
+ //for(int i = 0; i < 8; i++)
+ // digitalWrite(8+i, led & (1<<i) ? 1 : 0);
+ return ret;
}
void btn_init();
-void btn_read(char *line);
+int btn_read(char *line);
void setup()
{
+ Serial.println("setup start");
video_init();
rtc_init();
adc_init();
oled_init();
rds_init();
pcm_init();
+ rtc_set_clock();
+ rtc_set_alarm();
+ Serial.println("setup end");
}
+int rtc_ok = 0;
+int edid_ok = 0;
+int adc_ok = 0;
+int dac_ok = 0;
+int btn_ok = 0;
+int flash_ok = 0;
+int sd_ok = 0;
+
+int all_ok = 0;
+int last_all_ok = -1;
+
+int led_beat = 0;
+
+
void loop()
{
static uint8_t counter = 0;
const int nlines = 6;
char line[nlines][256];
+
+ digitalWrite(8+7, led_beat);
+ led_beat = !led_beat;
+
+#if 0
if(1 & ++counter)
pcm_tone();
else
pcm_mute();
- rtc_read(line[0]);
- edid_read(line[1]);
- adc_read(line[2]);
- dac_read(line[3]);
- btn_read(line[4]); // buttons. DIP switches and blink LEDs
+#endif
+
+ if ( rtc_ok == 0 ) rtc_ok = rtc_read(line[0]);
+ if ( rtc_ok == 1 ) {
+ Serial.println("RTC OK");
+ rtc_ok++;
+ all_ok++;
+ }
+ if ( edid_ok == 0 ) edid_ok = edid_read(line[1]);
+ if ( edid_ok == 1 ) {
+ Serial.println("EDID OK");
+ edid_ok++;
+ all_ok++;
+ }
+ if ( adc_ok < 8 ) adc_ok = adc_read(line[2]);
+ if ( adc_ok == 8 ) {
+ Serial.println("ADC OK");
+ adc_ok++;
+ all_ok++;
+ }
+ if ( dac_ok == 0 ) dac_ok = dac_read(line[3]);
+ if ( dac_ok == 1 ) {
+ Serial.println("DAC OK");
+ dac_ok++;
+ all_ok++;
+ }
+
+ int btn = btn_read(line[4]); // buttons. DIP switches and blink LEDs
+ if ( btn_ok == 0 && btn == 7 ) {
+ Serial.println("BTN OK");
+ btn_ok++;
+ all_ok++;
+ }
+
+#if 0
if(line[4][5] == '1') // BTN1 pressed
{
rtc_set_clock();
volatile uint32_t *simple_out = (uint32_t *)0xFFFFFF10;
simple_out[0] |= (1<<13); // bit 13 of simple_out is shutdown
}
+#endif
char flash_str[64], sd_str[64], oled_str[64];
- flash_read(flash_str);
- sd_read(sd_str); // esp32 must be flashed not to access SD card
+ if ( flash_ok == 0 ) flash_ok = flash_read(flash_str);
+ if ( flash_ok == 1 ) {
+ Serial.println("FLASH OK");
+ flash_ok++;
+ all_ok++;
+ }
+
+ if ( sd_ok == 0 ) sd_ok = sd_read(sd_str); // esp32 must be flashed not to access SD card
+ if ( sd_ok == 1 ) {
+ Serial.println("SD OK");
+ sd_ok++;
+ all_ok++;
+ }
+
+#if 0
oled_read(oled_str);
+#endif
+
+ Serial.print("all_ok=");
+ Serial.println(all_ok);
+
sprintf(line[5], "%s %s %s\n", flash_str, oled_str, sd_str);
line[6][0]='\0';
//ram_test(line[5]); // works but too slow, need speedup
Serial.println("");
for(int i = 0; i < nlines; i++)
Serial.print(line[i]);
+
cls();
for(int i = 0; i < nlines; i++)
prints(line[i]);
+
while((*c2.vblank_reg & 0x80) == 0);
c2.sprite_refresh();
// delay(1000);
}
-void dac_read(char *a)
+int dac_read(char *a)
{
+ int ret = 0;
uint32_t probeword, checkword, difference;
// static uint8_t counter = 0; // moving bit for detection state
uint32_t i;
dac_v,
(fail & 0xF00) == 0 ? " OK " : "FAIL"
);
+ if ((fail & 0xFFF) == 0) ret++;
+ return ret;
}
void dac_init();
-void dac_read(char *a);
+int dac_read(char *a);
int count = 0;
char edidarray[128];
-void edid_setup()
+int edid_setup()
{
Wire.setClock(100000L); // 100000-400000
Wire.begin(); // join i2c bus (address optional for master)
}
}
-void edid_read(char *a)
+int edid_read(char *a)
{
+ int ret = 0;
+
for(byte i = 0; i < 128; i++)
edidarray[i] = i;
int edid_count = edidreadbytes(edidarray);
edid_checksum,
edid_checksum == 0 ? "OK" : "FAIL"
);
+ if ( edid_checksum == 0 ) ret++;
+ return ret;
}
int edidreadbytes(char *array);
byte edidchecksum(char *array);
-void edid_read(char *a);
+int edid_read(char *a);
}
// set up variables using the SD utility library functions:
-void flash_read(char *a)
+int flash_read(char *a)
{
+ int ret = 0;
uint8_t id = flash_id();
- if(id >= 0x15 && id <= 0x17)
+ if(id >= 0x15 && id <= 0x17) {
sprintf(a, "FLASH: %02x OK ", id);
- else
+ ret = 1;
+ } else
sprintf(a, "FLASH: %02x FAIL", id);
+ return ret;
}
-void flash_read(char *a);
+int flash_read(char *a);
regwrite(0x03, 0x07 | 8); // weekday | battery_backup
regwrite(0x02, 0x23); // hour
regwrite(0x01, 0x59); // minute
- regwrite(0x00, 0x00 | 0x80); // second | start_oscillator
+ regwrite(0x00, 0x58 | 0x80); // second | start_oscillator
}
void rtc_set_alarm()
regwrite(0x08, 0x45);
}
-void rtc_read(char *a)
+int rtc_read(char *a)
{
+ int ret = 0;
char *eval;
uint8_t yr = regread(0x06,1) & 0x3F;
- if(yr >= 0x17 && yr <= 0x18)
- eval = regread(0x0D,1) & 8 ? " OK " : "WAIT";
- else
+ if(yr >= 0x17 && yr <= 0x18) {
+ //eval = regread(0x0D,1) & 8 ? " OK " : "WAIT";
+ if ( regread(0x0D,1) & 8 ) {
+ eval = " OK ";
+ ret = 1;
+ } else {
+ eval = "WAIT";
+ }
+ } else
eval = "FAIL";
sprintf(a, "20%02x-%02x-%02x %02x:%02x:%02x %s *-%02x %02x:%02x:%02x\n",
regread(0x06,1) & 0x3F, // year
regread(0x0B,1) & 0x7F, // alarm minute
regread(0x0A,1) & 0x7F // alarm second
);
+ return ret;
}
void rtc_init();
-void rtc_read(char *a);
+int rtc_read(char *a);
void rtc_set_alarm();
void rtc_set_clock();
void rtc_clear_interrupts();
SdVolume volume;
SdFile root;
// reading sd card type is slow
-void sd_read(char *a)
+int sd_read(char *a)
{
+ int ret = 0;
char *cardtype;
if (card.init(SPI_HALF_SPEED, 2))
{
cardtype = "? ";
}
sprintf(a, "SD: %s OK", cardtype);
+ ret = 1;
}
else
{
sprintf(a, "SD: FAIL ");
}
+ return ret;
}
#endif
-void sd_read(char *a);
+int sd_read(char *a);