#include "log.h"
-typedef uint64_t scs_timestamp_t;
+#define SHM_KEY 0xecc11
-/*
- * int shmget(key_t key, size_t size, int shmflg);
- * void *shmat(int shmid, const void *shmaddr, int shmflg);
- * int shmdt(const void *shmaddr);
- * int shmctl(int shmid, int cmd, struct shmid_ds *buf);
-*/
+typedef uint64_t scs_timestamp_t;
struct telemetry_state_t
{
-
- scs_timestamp_t timestamp;
- scs_timestamp_t raw_rendering_timestamp;
- scs_timestamp_t raw_simulation_timestamp;
- scs_timestamp_t raw_paused_simulation_timestamp;
-
-
- bool orientation_available;
- float heading;
- float pitch;
- float roll;
-
- float speed;
- float rpm;
- int gear;
- float cc; //cruise_control
+ scs_timestamp_t timestamp;
+ scs_timestamp_t raw_rendering_timestamp;
+ scs_timestamp_t raw_simulation_timestamp;
+ scs_timestamp_t raw_paused_simulation_timestamp;
+
+ bool orientation_available;
+ float heading;
+ float pitch;
+ float roll;
+
+ float speed;
+ float rpm;
+ int gear;
+ float cc; //cruise_control
float fc_avg; //fuel consumption average
-
} *telemetry;
static volatile int force_quit;
-static void handle_signal(int sig){
+static void handle_signal(int sig) {
fprintf (stderr, "SIGNAL: %d\n", sig);
switch (sig){
case SIGTERM:
}
}
-#define KEY 0xecc11
-
-static int shmputter(void){
- int shmid;
- shmid = shmget (KEY, sizeof (struct telemetry_state_t), IPC_CREAT | IPC_EXCL | 0600);
- if (shmid < 0) return -1;
- telemetry = shmat (shmid, NULL, 0);
- while (!force_quit){
- if (telemetry -> cc > 10)
- telemetry -> cc -= 10;
- else
- telemetry -> cc += 20;
- sleep (1);
- }
- shmdt (telemetry);
- shmctl (shmid, IPC_RMID, NULL);
- return 0;
-}
-
enum respond_code {
- r_index,
- r_json,
- r_none
+ r_index,
+ r_json,
+ r_none
};
-static void respond(int fd, const char *req, int code){
+static void respond(int fd, const char *req, int code) {
char buf[4096];
char origin[256] = "http://localhost";
char host[256] = "localhost";
const char *s;
- switch (code){
- case r_json:
- case r_index:
- s = strstr(req, "Origin:");
- if (s){
- s += 8; //strlen("Origin: ");
- const char *e = strstr(s, "\r\n");
- strncpy(origin, s, e-s);
- }
- s = strstr(req, "Host:");
- if (s){
- s += 6;//strlen("Host: ");
- const char *e = strstr(s, "\r\n");
- strncpy(host, s, e-s);
- }
-
- write(fd, buf, sprintf (buf, "HTTP/1.1 200 OK\r\n"));
- write(fd, buf, sprintf (buf, "Host: %s\r\n", host));
- if (r_json == code){
- write(fd, buf, sprintf (buf, "Access-Control-Allow-Origin: %s\r\n", origin));
- write(fd, buf, sprintf (buf, "Content-type: text/json\r\n"));
- write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
- write(fd, buf, sprintf (buf, "{ \"fc_avg\": %3.2f, \"speed\": %3.2f, \"cc\": %3.2f }",
- 100.0 * telemetry->fc_avg , telemetry -> speed * 3.6, telemetry -> cc * 3.6));
+ switch (code) {
+ case r_json:
+ case r_index:
+ s = strstr(req, "Origin:");
+ if (s){
+ s += 8; //strlen("Origin: ");
+ const char *e = strstr(s, "\r\n");
+ strncpy(origin, s, e-s);
+ }
+ s = strstr(req, "Host:");
+ if (s){
+ s += 6;//strlen("Host: ");
+ const char *e = strstr(s, "\r\n");
+ strncpy(host, s, e-s);
+ }
+
+ write(fd, buf, sprintf (buf, "HTTP/1.1 200 OK\r\n"));
+ write(fd, buf, sprintf (buf, "Host: %s\r\n", host));
+ if (r_json == code){
+ write(fd, buf, sprintf (buf, "Access-Control-Allow-Origin: %s\r\n", origin));
+ write(fd, buf, sprintf (buf, "Content-type: text/json\r\n"));
+ write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
+ write(fd, buf, sprintf (buf, "{ \"fc_avg\": %3.2f, \"speed\": %3.2f, \"cc\": %3.2f }",
+ 100.0 * telemetry->fc_avg , telemetry -> speed * 3.6, telemetry -> cc * 3.6));
+ } else {
+ struct file_info_t fi;
+ if (0 == fserv_open_server("index.html", &fi)){
+ write(fd, buf, sprintf (buf, "Content-type: text/html\r\n"));
+ write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
+ fserv_sendfile(fd, &fi);
+ fserv_close(&fi);
} else {
- struct file_info_t fi;
- if (0 == fserv_open_server("index.html", &fi)){
- write(fd, buf, sprintf (buf, "Content-type: text/html\r\n"));
- write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
- fserv_sendfile(fd, &fi);
- fserv_close(&fi);
- } else {
- write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n"));
- write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
- write(fd, buf, sprintf (buf, "Tough luck"));
- }
+ write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n"));
+ write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
+ write(fd, buf, sprintf (buf, "Tough luck"));
}
- break;
- case r_none:
- write(fd, buf, sprintf (buf, "HTTP/1.1 404 Not Found\r\n"));
- write(fd, buf, sprintf (buf, "Host: localhost\r\n"));
- write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n"));
- write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
- write(fd, buf, sprintf (buf, "Fuck you 404!"));
- break;
- default:
- write(fd, buf, sprintf (buf, "HTTP/1.1 500 Internal Server Error\r\n"));
- write(fd, buf, sprintf (buf, "Host: localhost\r\n"));
- write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n"));
- write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
- write(fd, buf, sprintf (buf, "Fuck you 500!"));
- break;
-
+ }
+ break;
+ case r_none:
+ write(fd, buf, sprintf (buf, "HTTP/1.1 404 Not Found\r\n"));
+ write(fd, buf, sprintf (buf, "Host: localhost\r\n"));
+ write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n"));
+ write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
+ write(fd, buf, sprintf (buf, "Fuck you 404!"));
+ break;
+ default:
+ write(fd, buf, sprintf (buf, "HTTP/1.1 500 Internal Server Error\r\n"));
+ write(fd, buf, sprintf (buf, "Host: localhost\r\n"));
+ write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n"));
+ write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n"));
+ write(fd, buf, sprintf (buf, "Fuck you 500!"));
+ break;
}
}
-static int receive(int fd, int timeout){
-struct pollfd pe;
-int res;
-pe.fd = fd;
-char buf[2048];
-int bread, total;
+static int receive(int fd, int timeout) {
+ struct pollfd pe;
+ int res;
+ pe.fd = fd;
+ char buf[2048];
+ int bread, total;
-total = 0;
-*buf = 0;
-do {
- pe.events = POLLIN;
- pe.revents = 0;
- if( (0 < (res = poll (&pe, 1, timeout))) && pe.revents == POLLIN){
- errno = 0;
- bread = read(fd, buf + total, sizeof buf - total);
- if (bread < 0)
- switch (errno){
+ total = 0;
+ *buf = 0;
+ do {
+ pe.events = POLLIN;
+ pe.revents = 0;
+ res = poll(&pe, 1, timeout);
+ if ( 0 < res && pe.revents == POLLIN ) {
+ errno = 0;
+ bread = read(fd, buf + total, sizeof buf - total);
+ if ( 0 > bread ) {
+ switch (errno) {
case EAGAIN:
//case EWOULDBLOCK:
case EINTR:
break;
-
default:
res = -1;
break;
- } else
- if (0 == bread && 0 == errno) { res = -1; }
- else {
- total += bread;
- buf[total] = 0;
- if (strstr(buf, "\r\n\r\n")){
- fprintf (stderr, "%s", buf);
- if (0 == strncmp(buf, "GET /json HTTP", 10))
- respond(fd, buf, r_json);
- else
- if (0 == strncmp(buf, "GET / HTTP", 10))
- respond(fd, buf, r_index);
- else
- respond(fd, NULL, r_none);
- *buf = 0;
- res = 0;
+ }
+ }
+ else if ( 0 == bread && 0 == errno ) {
+ res = -1;
+ }
+ else {
+ total += bread;
+ buf[total] = 0;
+ if ( strstr(buf, "\r\n\r\n" ) ) {
+ fprintf (stderr, "%s", buf);
+ if (0 == strncmp(buf, "GET /json HTTP", 10))
+ respond(fd, buf, r_json);
+ else if (0 == strncmp(buf, "GET / HTTP", 10))
+ respond(fd, buf, r_index);
+ else
+ respond(fd, NULL, r_none);
+ *buf = 0;
+ res = 0;
+ }
}
}
- }
- timeout = 200;
-} while ((1 == res) && (pe.revents == POLLIN) && !force_quit);
-return res;
+ timeout = 200;
+ } while ( 1 == res && pe.revents == POLLIN && !force_quit );
+ return res;
}
-static void *handle_conn( void *p ){
+static void *handle_conn( void *p ) {
int sock = *(int*)p;
int err;
- DPRINT ("sock: %d\n", sock);
+ DPRINT( "sock: %d\n", sock );
do {
- err = receive (sock, 1000);
- } while (err > 0 && !force_quit);
-
+ err = receive(sock, 1000);
+ } while ( 0 < err && !force_quit );
net_close( sock );
return p;
}
-static int shmgetter(void){
+static int shmgetter(void) {
int ret;
int shmid;
int as, ss;
-
pthread_t tid;
pthread_attr_t attr;
- shmid = shmget (KEY, sizeof (struct telemetry_state_t), 0);
- if (shmid < 0) {
- EPRINT( "shmget failed\n" );
+ shmid = shmget(SHM_KEY, sizeof *telemetry, 0);
+ if ( 0 > shmid ) {
+ EPRINT( "shmget failed\n" );
ret = -1;
goto err_shmget;
}
- telemetry = shmat (shmid, NULL, SHM_RDONLY);
- if ((void *) -1 == telemetry){
- EPRINT( "shmget failed\n" );
- ret = -2;
- goto err_shmat;
- }
+ telemetry = shmat(shmid, NULL, SHM_RDONLY);
+ if ((void *)-1 == telemetry) {
+ EPRINT( "shmget failed\n" );
+ ret = -2;
+ goto err_shmat;
+ }
ss = net_open_server( 8837, "*" );
- if ( ss < 0 )
- {
- EPRINT( "net_open_server failed!\n" );
+ if ( ss < 0 ) {
+ EPRINT( "net_open_server failed!\n" );
ret = -3;
- goto err_open_server;
- }
+ goto err_open_server;
+ }
- while (!force_quit){
- if ((as = net_accept( ss )) > 0){
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&tid, &attr, handle_conn, &as);
- usleep (100);
+ while ( !force_quit ) {
+ if ( (as = net_accept( ss )) > 0 ) {
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create(&tid, &attr, handle_conn, &as);
+ usleep (100);
}
}
err_open_server:
err_shmat:
- shmdt (telemetry);
+ shmdt(telemetry);
err_shmget:
return ret;
}
-
-int main(int argc, char *argv[]){
+int main(int argc, char *argv[]) {
int res;
- //install signal handlers
+
+ //install signal handlers
signal(SIGTERM, handle_signal);
signal(SIGINT, handle_signal);
-
- if (strstr(argv[0], "shmput")){
- res = shmputter();
- } else {
- res = shmgetter();
- }
+ res = shmgetter();
puts("");
return res;
}