Captures digital signals and then displays them in a web browser using SVG.
Dependencies: EthernetNetIf mbed HTTPServer
main.cpp@0:47fad9a39024, 2010-08-13 (annotated)
- Committer:
- romilly
- Date:
- Fri Aug 13 10:22:41 2010 +0000
- Revision:
- 0:47fad9a39024
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
romilly | 0:47fad9a39024 | 1 | #include "mbed.h" |
romilly | 0:47fad9a39024 | 2 | #include "EthernetNetIf.h" |
romilly | 0:47fad9a39024 | 3 | #include "HTTPServer.h" |
romilly | 0:47fad9a39024 | 4 | |
romilly | 0:47fad9a39024 | 5 | #define SAMPLE_COUNT 1000 |
romilly | 0:47fad9a39024 | 6 | |
romilly | 0:47fad9a39024 | 7 | LocalFileSystem local("local"); |
romilly | 0:47fad9a39024 | 8 | |
romilly | 0:47fad9a39024 | 9 | DigitalOut led1(LED1); |
romilly | 0:47fad9a39024 | 10 | DigitalIn sda(p9); |
romilly | 0:47fad9a39024 | 11 | DigitalIn scl(p10); |
romilly | 0:47fad9a39024 | 12 | |
romilly | 0:47fad9a39024 | 13 | char sdamem[SAMPLE_COUNT]; |
romilly | 0:47fad9a39024 | 14 | char sclmem[SAMPLE_COUNT]; |
romilly | 0:47fad9a39024 | 15 | |
romilly | 0:47fad9a39024 | 16 | EthernetNetIf eth; |
romilly | 0:47fad9a39024 | 17 | HTTPServer svr; |
romilly | 0:47fad9a39024 | 18 | |
romilly | 0:47fad9a39024 | 19 | void capture() { |
romilly | 0:47fad9a39024 | 20 | scl.mode(PullUp); |
romilly | 0:47fad9a39024 | 21 | while (scl) { |
romilly | 0:47fad9a39024 | 22 | wait_us(2); |
romilly | 0:47fad9a39024 | 23 | } |
romilly | 0:47fad9a39024 | 24 | for (int i = 0; i < SAMPLE_COUNT; i++) { |
romilly | 0:47fad9a39024 | 25 | sdamem[i] = sda; |
romilly | 0:47fad9a39024 | 26 | sclmem[i] = scl; |
romilly | 0:47fad9a39024 | 27 | wait_us(1); |
romilly | 0:47fad9a39024 | 28 | } |
romilly | 0:47fad9a39024 | 29 | } |
romilly | 0:47fad9a39024 | 30 | |
romilly | 0:47fad9a39024 | 31 | void plot(FILE* fp, char * name, char * mem, int offset) { |
romilly | 0:47fad9a39024 | 32 | fprintf(fp, "<g transform='translate(100,%i)'>", offset); |
romilly | 0:47fad9a39024 | 33 | fprintf(fp, "<text x='10' y='40' style='fill:black;stroke:none;font-size:16pt;font-family:arial'>%s</text>", name); |
romilly | 0:47fad9a39024 | 34 | fprintf(fp, "<path d='M 50 50 "); |
romilly | 0:47fad9a39024 | 35 | for (int i = 0; i < SAMPLE_COUNT; i++) { |
romilly | 0:47fad9a39024 | 36 | fprintf(fp, "L %i %i %i %i ", 50+ 5*i, 50*mem[i], 55+5*i, 50*mem[i]); |
romilly | 0:47fad9a39024 | 37 | } |
romilly | 0:47fad9a39024 | 38 | fprintf(fp, "' />\n"); |
romilly | 0:47fad9a39024 | 39 | fprintf(fp, "</g>"); |
romilly | 0:47fad9a39024 | 40 | } |
romilly | 0:47fad9a39024 | 41 | |
romilly | 0:47fad9a39024 | 42 | void writeSVG() { |
romilly | 0:47fad9a39024 | 43 | FILE *fp = fopen("/local/out.svg", "w"); // Open "out.txt" on the local file system for writing |
romilly | 0:47fad9a39024 | 44 | fprintf(fp, "<svg xmlns='http://www.w3.org/2000/svg' width='1200' height='500'>\n"); |
romilly | 0:47fad9a39024 | 45 | fprintf(fp, "<text x='500' y='50' style='fill:black;stroke:none;font-size:20pt;font-family:arial'>I2C bus activity</text>"); |
romilly | 0:47fad9a39024 | 46 | fprintf(fp, "<g style='fill:none;stroke:black'>"); |
romilly | 0:47fad9a39024 | 47 | |
romilly | 0:47fad9a39024 | 48 | plot(fp, "SDA", sdamem, 110); |
romilly | 0:47fad9a39024 | 49 | plot(fp, "SCL", sclmem, 210); |
romilly | 0:47fad9a39024 | 50 | |
romilly | 0:47fad9a39024 | 51 | fprintf(fp, "</g>"); |
romilly | 0:47fad9a39024 | 52 | fprintf(fp, "</svg>"); |
romilly | 0:47fad9a39024 | 53 | fclose(fp); |
romilly | 0:47fad9a39024 | 54 | } |
romilly | 0:47fad9a39024 | 55 | |
romilly | 0:47fad9a39024 | 56 | void startServer() { |
romilly | 0:47fad9a39024 | 57 | EthernetErr ethErr = eth.setup(); |
romilly | 0:47fad9a39024 | 58 | if (ethErr) { |
romilly | 0:47fad9a39024 | 59 | printf("Error %d in setup.\n", ethErr); |
romilly | 0:47fad9a39024 | 60 | return; |
romilly | 0:47fad9a39024 | 61 | } |
romilly | 0:47fad9a39024 | 62 | printf("Server setup OK\n"); |
romilly | 0:47fad9a39024 | 63 | |
romilly | 0:47fad9a39024 | 64 | FSHandler::mount("/local", "/"); //Mount /webfs path on web root path |
romilly | 0:47fad9a39024 | 65 | svr.addHandler<FSHandler>("/"); //Default handler |
romilly | 0:47fad9a39024 | 66 | |
romilly | 0:47fad9a39024 | 67 | svr.bind(80); |
romilly | 0:47fad9a39024 | 68 | |
romilly | 0:47fad9a39024 | 69 | printf("Listening...\n"); |
romilly | 0:47fad9a39024 | 70 | |
romilly | 0:47fad9a39024 | 71 | Timer tm; |
romilly | 0:47fad9a39024 | 72 | tm.start(); |
romilly | 0:47fad9a39024 | 73 | //Listen indefinitely |
romilly | 0:47fad9a39024 | 74 | while (true) { |
romilly | 0:47fad9a39024 | 75 | Net::poll(); |
romilly | 0:47fad9a39024 | 76 | if (tm.read()>.5) { |
romilly | 0:47fad9a39024 | 77 | led1=!led1; //Show that we are alive |
romilly | 0:47fad9a39024 | 78 | tm.start(); |
romilly | 0:47fad9a39024 | 79 | } |
romilly | 0:47fad9a39024 | 80 | } |
romilly | 0:47fad9a39024 | 81 | } |
romilly | 0:47fad9a39024 | 82 | |
romilly | 0:47fad9a39024 | 83 | |
romilly | 0:47fad9a39024 | 84 | int main() { |
romilly | 0:47fad9a39024 | 85 | led1 = 0; |
romilly | 0:47fad9a39024 | 86 | capture(); |
romilly | 0:47fad9a39024 | 87 | writeSVG(); |
romilly | 0:47fad9a39024 | 88 | startServer(); |
romilly | 0:47fad9a39024 | 89 | } |
romilly | 0:47fad9a39024 | 90 | |
romilly | 0:47fad9a39024 | 91 | |
romilly | 0:47fad9a39024 | 92 |