Robert Cook
/
NetworkAnimator
main.cpp@0:32a0996dff0f, 2012-06-13 (annotated)
- Committer:
- robertcook
- Date:
- Wed Jun 13 18:39:46 2012 +0000
- Revision:
- 0:32a0996dff0f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
robertcook | 0:32a0996dff0f | 1 | /* |
robertcook | 0:32a0996dff0f | 2 | * Echo server |
robertcook | 0:32a0996dff0f | 3 | * Listens on TCP and UDP ports 7 for any incoming connections |
robertcook | 0:32a0996dff0f | 4 | * Re-transmits any incoming bytes |
robertcook | 0:32a0996dff0f | 5 | */ |
robertcook | 0:32a0996dff0f | 6 | |
robertcook | 0:32a0996dff0f | 7 | #include "mbed.h" |
robertcook | 0:32a0996dff0f | 8 | #include "EthernetNetIf.h" |
robertcook | 0:32a0996dff0f | 9 | |
robertcook | 0:32a0996dff0f | 10 | #include "EchoServer.h" |
robertcook | 0:32a0996dff0f | 11 | |
robertcook | 0:32a0996dff0f | 12 | // Our Ethernet interface |
robertcook | 0:32a0996dff0f | 13 | EthernetNetIf eth; |
robertcook | 0:32a0996dff0f | 14 | // Our Echo server |
robertcook | 0:32a0996dff0f | 15 | EchoServer server; |
robertcook | 0:32a0996dff0f | 16 | |
robertcook | 0:32a0996dff0f | 17 | #define byte char |
robertcook | 0:32a0996dff0f | 18 | |
robertcook | 0:32a0996dff0f | 19 | #define ScreenWidth 32 |
robertcook | 0:32a0996dff0f | 20 | #define ScreenHeight 15 |
robertcook | 0:32a0996dff0f | 21 | |
robertcook | 0:32a0996dff0f | 22 | #define HTTPChunkSize 1024 |
robertcook | 0:32a0996dff0f | 23 | |
robertcook | 0:32a0996dff0f | 24 | #define ScreenBufferSize ScreenWidth*ScreenHeight*3 |
robertcook | 0:32a0996dff0f | 25 | |
robertcook | 0:32a0996dff0f | 26 | bool drawReadyFlag = false; |
robertcook | 0:32a0996dff0f | 27 | |
robertcook | 0:32a0996dff0f | 28 | typedef struct { |
robertcook | 0:32a0996dff0f | 29 | byte blue; |
robertcook | 0:32a0996dff0f | 30 | byte green; |
robertcook | 0:32a0996dff0f | 31 | byte red; |
robertcook | 0:32a0996dff0f | 32 | } color; |
robertcook | 0:32a0996dff0f | 33 | |
robertcook | 0:32a0996dff0f | 34 | unsigned int fileFrameCount; |
robertcook | 0:32a0996dff0f | 35 | |
robertcook | 0:32a0996dff0f | 36 | byte screenBuf[ScreenBufferSize]; |
robertcook | 0:32a0996dff0f | 37 | |
robertcook | 0:32a0996dff0f | 38 | Serial pc(USBTX, USBRX); |
robertcook | 0:32a0996dff0f | 39 | |
robertcook | 0:32a0996dff0f | 40 | SPI spi(p5, NC, p7); // mosi, miso, sclk |
robertcook | 0:32a0996dff0f | 41 | |
robertcook | 0:32a0996dff0f | 42 | void writePixel(int x, int y) { |
robertcook | 0:32a0996dff0f | 43 | |
robertcook | 0:32a0996dff0f | 44 | spi.write(screenBuf[(x*ScreenHeight+y)*3]); |
robertcook | 0:32a0996dff0f | 45 | spi.write(screenBuf[(x*ScreenHeight+y)*3+1]); |
robertcook | 0:32a0996dff0f | 46 | spi.write(screenBuf[(x*ScreenHeight+y)*3+2]); |
robertcook | 0:32a0996dff0f | 47 | |
robertcook | 0:32a0996dff0f | 48 | } |
robertcook | 0:32a0996dff0f | 49 | |
robertcook | 0:32a0996dff0f | 50 | |
robertcook | 0:32a0996dff0f | 51 | void updateDisplay() { |
robertcook | 0:32a0996dff0f | 52 | for (int y = ScreenHeight-1; y >= 0; y--) { |
robertcook | 0:32a0996dff0f | 53 | if (y % 2 == 0) { |
robertcook | 0:32a0996dff0f | 54 | for (int x = 0; x < ScreenWidth; x++) |
robertcook | 0:32a0996dff0f | 55 | writePixel(x,y); |
robertcook | 0:32a0996dff0f | 56 | } |
robertcook | 0:32a0996dff0f | 57 | else { |
robertcook | 0:32a0996dff0f | 58 | for (int x = ScreenWidth-1; x >= 0; x--) |
robertcook | 0:32a0996dff0f | 59 | writePixel(x,y); |
robertcook | 0:32a0996dff0f | 60 | } |
robertcook | 0:32a0996dff0f | 61 | } |
robertcook | 0:32a0996dff0f | 62 | wait_us(800); |
robertcook | 0:32a0996dff0f | 63 | } |
robertcook | 0:32a0996dff0f | 64 | |
robertcook | 0:32a0996dff0f | 65 | |
robertcook | 0:32a0996dff0f | 66 | |
robertcook | 0:32a0996dff0f | 67 | void hexDump(byte *buf, unsigned long len, int wid) { |
robertcook | 0:32a0996dff0f | 68 | |
robertcook | 0:32a0996dff0f | 69 | for (unsigned long i = 0; i < len; i++) { |
robertcook | 0:32a0996dff0f | 70 | if (!(i % wid)) pc.printf("\n"); |
robertcook | 0:32a0996dff0f | 71 | else if (!(i % 4)) pc.printf(" "); |
robertcook | 0:32a0996dff0f | 72 | |
robertcook | 0:32a0996dff0f | 73 | pc.printf("%02x", buf[i]); |
robertcook | 0:32a0996dff0f | 74 | } |
robertcook | 0:32a0996dff0f | 75 | pc.printf("\n"); |
robertcook | 0:32a0996dff0f | 76 | } |
robertcook | 0:32a0996dff0f | 77 | |
robertcook | 0:32a0996dff0f | 78 | |
robertcook | 0:32a0996dff0f | 79 | /* |
robertcook | 0:32a0996dff0f | 80 | Function: main |
robertcook | 0:32a0996dff0f | 81 | |
robertcook | 0:32a0996dff0f | 82 | Sets up the Ethernet interface using DHCP, reports the assigned |
robertcook | 0:32a0996dff0f | 83 | IP address via serial, binds the Echo server to port 7 on |
robertcook | 0:32a0996dff0f | 84 | TCP and UDP and then sits in a loop calling Net::poll() to |
robertcook | 0:32a0996dff0f | 85 | keep the network stack doing its thing |
robertcook | 0:32a0996dff0f | 86 | */ |
robertcook | 0:32a0996dff0f | 87 | int main() { |
robertcook | 0:32a0996dff0f | 88 | printf("\r\nSetting up...\r\n"); |
robertcook | 0:32a0996dff0f | 89 | EthernetErr ethErr = eth.setup(); |
robertcook | 0:32a0996dff0f | 90 | if (ethErr) { |
robertcook | 0:32a0996dff0f | 91 | printf("Error %d in setup.\n", ethErr); |
robertcook | 0:32a0996dff0f | 92 | return -1; |
robertcook | 0:32a0996dff0f | 93 | } |
robertcook | 0:32a0996dff0f | 94 | IpAddr ip = eth.getIp(); |
robertcook | 0:32a0996dff0f | 95 | printf("mbed IP Address is %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); |
robertcook | 0:32a0996dff0f | 96 | |
robertcook | 0:32a0996dff0f | 97 | server.bind(); |
robertcook | 0:32a0996dff0f | 98 | |
robertcook | 0:32a0996dff0f | 99 | printf("Entering while loop Net::poll()ing\r\n"); |
robertcook | 0:32a0996dff0f | 100 | while (1) { |
robertcook | 0:32a0996dff0f | 101 | Net::poll(); |
robertcook | 0:32a0996dff0f | 102 | if (drawReadyFlag) { |
robertcook | 0:32a0996dff0f | 103 | updateDisplay(); |
robertcook | 0:32a0996dff0f | 104 | drawReadyFlag = false; |
robertcook | 0:32a0996dff0f | 105 | } |
robertcook | 0:32a0996dff0f | 106 | } |
robertcook | 0:32a0996dff0f | 107 | } |