|
-
-
- #include <OctoWS2811.h>
- #include <SPI.h>
- #include <SD.h>
- #include <Audio.h>
- #include <Wire.h>
-
- #define LED_WIDTH 60
- #define LED_HEIGHT 32
-
- #define FILENAME "VIDEO.BIN"
-
- const int ledsPerStrip = LED_WIDTH * LED_HEIGHT / 8;
- DMAMEM int displayMemory[ledsPerStrip*6];
- int drawingMemory[ledsPerStrip*6];
- elapsedMicros elapsedSinceLastFrame = 0;
- bool playing = false;
-
- OctoWS2811 leds(ledsPerStrip, displayMemory, drawingMemory, WS2811_800kHz);
- File videofile;
-
- AudioPlayQueue audio;
- AudioOutputAnalog dac;
- AudioConnection patchCord1(audio, dac);
-
-
- void setup() {
- AudioMemory(40);
-
- delay(50);
- Serial.println("VideoSDcard");
- leds.begin();
- leds.show();
- if (!SD.begin(3)) stopWithErrorMessage("Could not access SD card");
- Serial.println("SD card ok");
- videofile = SD.open(FILENAME, FILE_READ);
- if (!videofile) stopWithErrorMessage("Could not read " FILENAME);
- Serial.println("File opened");
- playing = true;
- elapsedSinceLastFrame = 0;
- }
-
-
-
-
-
-
- bool sd_card_read(void *ptr, unsigned int len)
- {
- static unsigned char buffer[512];
- static unsigned int bufpos = 0;
- static unsigned int buflen = 0;
- unsigned char *dest = (unsigned char *)ptr;
- unsigned int n;
-
- while (len > 0) {
- if (buflen == 0) {
- n = videofile.read(buffer, 512);
- if (n == 0) return false;
- buflen = n;
- bufpos = 0;
- }
- unsigned int n = buflen;
- if (n > len) n = len;
- memcpy(dest, buffer + bufpos, n);
- dest += n;
- bufpos += n;
- buflen -= n;
- len -= n;
- }
- return true;
- }
-
-
- void sd_card_skip(unsigned int len)
- {
- unsigned char buf[256];
-
- while (len > 0) {
- unsigned int n = len;
- if (n > sizeof(buf)) n = sizeof(buf);
- sd_card_read(buf, n);
- len -= n;
- }
- }
-
-
- void loop()
- {
- unsigned char header[5];
-
- if (playing) {
- if (sd_card_read(header, 5)) {
- if (header[0] == '*') {
-
- unsigned int size = (header[1] | (header[2] << 8)) * 3;
- unsigned int usec = header[3] | (header[4] << 8);
- unsigned int readsize = size;
-
- if (readsize > sizeof(drawingMemory)) {
- readsize = sizeof(drawingMemory);
- }
- if (sd_card_read(drawingMemory, readsize)) {
-
-
- while (elapsedSinceLastFrame < usec) ;
- elapsedSinceLastFrame -= usec;
- leds.show();
- } else {
- error("unable to read video frame data");
- return;
- }
- if (readsize < size) {
- sd_card_skip(size - readsize);
- }
- } else if (header[0] == '%') {
-
- unsigned int size = (header[1] | (header[2] << 8)) * 2;
-
-
- while (size > 0) {
- unsigned int len = size;
- if (len > 256) len = 256;
- int16_t *p = audio.getBuffer();
- if (!sd_card_read(p, len)) {
- error("unable to read audio frame data");
- return;
- }
- if (len < 256) {
- for (int i=len; i < 256; i++) {
- *((char *)p + i) = 0;
- }
- }
- audio.playBuffer();
- size -= len;
- }
- } else {
- error("unknown header");
- return;
- }
- } else {
- error("unable to read 5-byte header");
- return;
- }
- } else {
- delay(2000);
- videofile = SD.open(FILENAME, FILE_READ);
- if (videofile) {
- Serial.println("File opened");
- playing = true;
- elapsedSinceLastFrame = 0;
- }
- }
- }
-
-
- void error(const char *str)
- {
- Serial.print("error: ");
- Serial.println(str);
- videofile.close();
- playing = false;
- }
-
-
-
- void stopWithErrorMessage(const char *str)
- {
- while (1) {
- Serial.println(str);
- delay(1000);
- }
- }
|