Captures digital signals and then displays them in a web browser using SVG.

Dependencies:   EthernetNetIf mbed HTTPServer

Committer:
romilly
Date:
Fri Aug 13 10:22:41 2010 +0000
Revision:
0:47fad9a39024

        

Who changed what in which revision?

UserRevisionLine numberNew 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