static void http_callback(evhttp_request *req,const char *uri,const char *path,Worker& worker) { bool do_shutdown = false; printf("Got uri='%s', path='%s', thread # %d\n", uri,path,worker.get_threadx()); if ( !strcmp(path,"/cpuinfo") ) { worker.add("<html>\r\n<head>\r\n<title>cpuinfo</title></head>\r\n"); worker.add("<body><pre>\r\n"); FILE *f = fopen("/proc/cpuinfo","r"); if ( f ) { char inbuf[1024]; while ( fgets(inbuf,sizeof inbuf,f) != nullptr ) { char *cp = strrchr(inbuf,'\n'); if ( cp != 0 && size_t(cp - inbuf) < sizeof inbuf - 3 ) strcpy(cp,"\r\n"); worker.add(inbuf,strlen(inbuf)); } fclose(f); } worker.add("</pre></body>\r\n"); } else if ( !strcmp(path,"/gpio") ) { worker.add("<html>\r\n<head>\r\n<title>cpuinfo</title></head>\r\n"); worker.add("<body><table>\r\n"); worker.add("<tr><td>GPIO</td><td>ALTFUN</td><td>LEV</td>" "<td>SLEW</td><td>HYST</td><td>DRIVE</td>" "<td>DESCRIPTION</td></tr>\r\n"); if ( gpio.get_error() != 0 ) { worker.add_printf("%s: obtaining gpio info\r\n", strerror(gpio.get_error())); } else { for (int gpno=0; gpno < 32; ++gpno ) { GPIO::IO io; bool slew_rate_limited, hysteresis; int drive, mA; gpio.alt_function(gpno,io); gpio.get_drive_strength( gpno, slew_rate_limited, hysteresis, drive); mA = 2 + drive * 2; worker.add_printf( "<tr>" "<td>%2d</td>" "<td>%s</td>" "<td>%d</td>" "<td>%c</td>" "<td>%c</td>" "<td>%2d mA</td>" "<td>%s</td></tr>\r\n", gpno, GPIO::alt_name(io), gpio.read(gpno), slew_rate_limited ? 'Y' : 'N', hysteresis ? 'Y' : 'N', mA, GPIO::gpio_alt_func(gpno,io)); } worker.add("</table></body>\r\n"); } } else if ( !strcmp(path,"/shutdown") ) { do_shutdown = true; worker.add_printf( "<html>\n <head>\n" " <title>%s</title>\n" " <base href='.../%s'>\n" " </head>\n" " <body>\n" " <h1>%s : thread %d, shutting down</h1>\n" " <ul>\n", path, path, path, worker.get_threadx()); } else { // This holds the content we're sending. worker.add_printf( "<html><head><title>%s</title></head>\r\n" "<body><h1>Response</h1>\r\n" "<ul><li>Path: %s</li>" "<li>URI: %s</li>" "<li>Thread: %d</li>" "</ul></body>\r\n", path, // title path, // Path uri, // URI worker.get_threadx()); // Thread evhttp_add_header(req->output_headers,"Connection","Close"); } worker.send_reply(200,"OK"); if ( do_shutdown ) webmain.shutdown(); }