Dependencies:   EthernetNetIf mbed HTTPClient_ToBeRemoved

main.cpp

Committer:
robertcook
Date:
2012-06-13
Revision:
0:5461db8e4caa

File content as of revision 0:5461db8e4caa:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPClient.h"

#define ScreenWidth 32
#define ScreenHeight 15

#define HTTPChunkSize 1024

#define ScreenBufferSize ScreenWidth*ScreenHeight*3

typedef struct {
  byte blue;
  byte green;
  byte red;
} color;

unsigned int fileFrameCount;

color disp[ScreenWidth][ScreenHeight];
byte screenBuf[ScreenBufferSize];
byte readBuf[HTTPChunkSize];

Serial pc(USBTX, USBRX);

SPI spi(p5, NC, p7); // mosi, miso, sclk

#define LEDCount 110
#define channels LEDCount*3

EthernetNetIf eth; 
HTTPClient http;

HTTPResult result;
bool completed = false;

void request_callback(HTTPResult r)
{
    result = r;
    completed = true;
}


void writePixel(int x, int y) {

    spi.write(screenBuf[(x*ScreenHeight+y)*3]);
    spi.write(screenBuf[(x*ScreenHeight+y)*3+1]);
    spi.write(screenBuf[(x*ScreenHeight+y)*3+2]);

}


void updateDisplay() {
    for (int y = ScreenHeight-1; y >= 0; y--) {
        if (y % 2 == 0) {
            for (int x = 0; x < ScreenWidth; x++) 
                writePixel(x,y);
        } 
        else {
            for (int x = ScreenWidth-1; x >= 0; x--)
                writePixel(x,y);
        }
    }
    wait_us(800);
}

 

void hexDump(byte *buf, unsigned long len, int wid) {

    for (unsigned long i = 0; i < len; i++) {
        if (!(i % wid)) pc.printf("\n");
        else if (!(i % 4)) pc.printf(" ");

        pc.printf("%02x", buf[i]);
    }
    pc.printf("\n");
}
      

int setupEthernet() {

    pc.printf("Start\n");

    pc.printf("Setting up...\n");
    EthernetErr ethErr = eth.setup();
     
    if(ethErr) {
        pc.printf("Error %d in setup.\n", ethErr);
        return -1;
    }
    pc.printf("Setup OK\n");
    return (0);
}


int main() {

    // Setup the spi for 8 bit data, high steady state clock,
    // second edge capture, with a 1MHz clock rate
    spi.format(8,1);
    spi.frequency(1000000);
    
    pc.baud(115200);
    
    setupEthernet();
    HTTPStream stream;
    unsigned long dataReadRemaining = 6;
    bool headerLoaded = false;
    unsigned int screenBufInd = 0;
    
    stream.readNext((byte *)readBuf, 6);
    
    HTTPResult r = http.get("http://192.168.1.129/traffic.vid", &stream, request_callback);
     
    while(!completed) {
        Net::poll(); //Polls the Networking stack
        
        if (stream.readable()) {
            unsigned int readLength = stream.readLen();
            
            // Load and process six byte header
            // Three integers -- frame count, height, width            
            if (headerLoaded == false) {
                headerLoaded = true;
                fileFrameCount = readBuf[0]+readBuf[1]*256;
                pc.printf("# of frames: %i\n", fileFrameCount);
                pc.printf("height x width: %i x %i\n", readBuf[2]+readBuf[3]*256, readBuf[4]+readBuf[5]*256);
                
                dataReadRemaining = ScreenBufferSize;
                stream.readNext(readBuf, HTTPChunkSize);
            }
            // else load image
            else {
                dataReadRemaining -= readLength;
                //pc.printf("%i", (unsigned int)dataReadRemaining);
                
                memcpy(screenBuf + screenBufInd, readBuf, readLength);
                
                // if any remaining data
                if (dataReadRemaining) {
                    //pc.printf(".\n");
                    screenBufInd += readLength;
                    stream.readNext((byte*)readBuf, (dataReadRemaining > HTTPChunkSize ? HTTPChunkSize : dataReadRemaining));
                }
                else {
                    //pc.printf("!\n"); 
                
                    // hexDump(screenBuf,1440,32);
                    updateDisplay();
                    //while(1);
                
                    dataReadRemaining = ScreenBufferSize;
                    screenBufInd = 0;
                    stream.readNext((byte*)readBuf, HTTPChunkSize); 
                }
            }
        }
    
    }
    pc.printf("\n--------------\n");
    if (result == HTTP_OK) pc.printf("Read completely\n"); 
    else pc.printf("Error %d\n", result);

  
    while(1){}
}