void extint_w2a(void *param) { int n, i, j; conn_t *conn = (conn_t *) param; u4_t ka_time = timer_sec(); // initialize extension for this connection send_msg_mc(conn->mc, false, "EXT ext_client_init"); nbuf_t *nb = NULL; while (TRUE) { int rx_chan, ext_rx_chan; ext_t *ext; if (nb) web_to_app_done(conn, nb); n = web_to_app(conn, &nb); if (n) { char *cmd = nb->buf; cmd[n] = 0; // okay to do this -- see nbuf.c:nbuf_allocq() char id[64]; ka_time = timer_sec(); // receive and send a roundtrip keepalive i = strcmp(cmd, "SET keepalive"); if (i == 0) { ext_send_msg(conn->ext_rx_chan, false, "EXT keepalive"); continue; } ext_rx_chan = conn->ext_rx_chan; //printf("extint_w2a: %s CONN%d-%p RX%d-%p %d <%s>\n", conn->ext? conn->ext->name:"?", conn->self_idx, conn, ext_rx_chan, (ext_rx_chan == -1)? 0:ext_users[ext_rx_chan].conn, strlen(cmd), cmd); // answer from client ext about who they are // match against list of known extensions and register msg handler char client[32]; int first_time; i = sscanf(cmd, "SET ext_switch_to_client=%s first_time=%d rx_chan=%d", client, &first_time, &rx_chan); if (i == 3) { for (i=0; i < n_exts; i++) { ext = ext_list[i]; if (strcmp(client, ext->name) == 0) { //printf("ext_switch_to_client: found func %p CONN%d-%p for ext %s RX%d\n", ext->receive_msgs, conn->self_idx, conn, client, rx_chan); ext_users[rx_chan].ext = ext; ext_users[rx_chan].conn = conn; conn->ext_rx_chan = rx_chan; conn->ext = ext; TaskNameS(ext->name); break; } } if (i == n_exts) panic("ext_switch_to_client: unknown ext"); // automatically let extension server-side know the connection has been established and // our stream thread is running if (first_time) ext->receive_msgs((char *) "SET ext_server_init", rx_chan); continue; } i = sscanf(cmd, "SET ext_blur=%d", &rx_chan); if (i == 1) { extint_ext_users_init(rx_chan); continue; } i = strcmp(cmd, "SET init"); if (i == 0) { continue; } i = sscanf(cmd, "SERVER DE CLIENT %s", id); if (i == 1) { continue; } ext_rx_chan = conn->ext_rx_chan; if (ext_rx_chan == -1) { printf("### extint_w2a: %s CONN%d-%p ext_rx_chan == -1?\n", conn->ext? conn->ext->name:"?", conn->self_idx, conn); continue; } ext = ext_users[ext_rx_chan].ext; if (ext == NULL) { printf("### extint_w2a: %s CONN%d-%p ext_rx_chan %d ext NULL?\n", conn->ext? conn->ext->name:"?", conn->self_idx, conn, ext_rx_chan); continue; } if (ext->receive_msgs) { //printf("extint_w2a: %s ext->receive_msgs() %p CONN%d-%p RX%d-%p %d <%s>\n", conn->ext? conn->ext->name:"?", ext->receive_msgs, conn->self_idx, conn, ext_rx_chan, (ext_rx_chan == -1)? 0:ext_users[ext_rx_chan].conn, strlen(cmd), cmd); if (ext->receive_msgs(cmd, ext_rx_chan)) continue; } else { printf("### extint_w2a: %s CONN%d-%p RX%d-%p ext->receive_msgs == NULL?\n", conn->ext? conn->ext->name:"?", conn->self_idx, conn, ext_rx_chan, (ext_rx_chan == -1)? 0:ext_users[ext_rx_chan].conn); continue; } printf("extint_w2a: %s CONN%d-%p unknown command: <%s> ======================================================\n", conn->ext? conn->ext->name:"?", conn->self_idx, conn, cmd); continue; } conn->keep_alive = timer_sec() - ka_time; bool keepalive_expired = (conn->keep_alive > KEEPALIVE_SEC); if (keepalive_expired) { ext_rx_chan = conn->ext_rx_chan; ext = ext_users[ext_rx_chan].ext; printf("EXT KEEP-ALIVE EXPIRED RX%d %s\n", ext_rx_chan, ext? ext->name : "(no ext)"); if (ext != NULL && ext->close_conn != NULL) ext->close_conn(ext_rx_chan); extint_ext_users_init(ext_rx_chan); rx_server_remove(conn); panic("shouldn't return"); } TaskSleep(250000); } }
void w2a_admin(void *param) { int n, i, j; conn_t *conn = (conn_t *) param; static char json_buf[16384]; u4_t ka_time = timer_sec(); // send initial values send_msg(conn, SM_NO_DEBUG, "ADM init=%d", RX_CHANS); nbuf_t *nb = NULL; while (TRUE) { if (nb) web_to_app_done(conn, nb); n = web_to_app(conn, &nb); if (n) { char *cmd = nb->buf; cmd[n] = 0; // okay to do this -- see nbuf.c:nbuf_allocq() ka_time = timer_sec(); if (rx_common_cmd("W/F", conn, cmd)) continue; //printf("ADMIN: %d <%s>\n", strlen(cmd), cmd); i = strcmp(cmd, "SET init"); if (i == 0) { continue; } i = strcmp(cmd, "SET gps_update"); if (i == 0) { gps_stats_t::gps_chan_t *c; char *cp = json_buf; n = sprintf(cp, "{ \"FFTch\":%d, \"ch\":[ ", gps.FFTch); cp += n; for (i=0; i < gps_chans; i++) { c = &gps.ch[i]; int un = c->ca_unlocked; n = sprintf(cp, "%s{ \"ch\":%d, \"prn\":%d, \"snr\":%d, \"rssi\":%d, \"gain\":%d, \"hold\":%d, \"wdog\":%d" ", \"unlock\":%d, \"parity\":%d, \"sub\":%d, \"sub_renew\":%d, \"novfl\":%d }", i? ", ":"", i, c->prn, c->snr, c->rssi, c->gain, c->hold, c->wdog, un, c->parity, c->sub, c->sub_renew, c->novfl); cp += n; c->parity = 0; for (j = 0; j < SUBFRAMES; j++) { if (c->sub_renew & (1<<j)) { c->sub |= 1<<j; c->sub_renew &= ~(1<<j); } } } n = sprintf(cp, " ]"); cp += n; UMS hms(gps.StatSec/60/60); unsigned r = (timer_ms() - gps.start)/1000; if (r >= 3600) { n = sprintf(cp, ", \"run\":\"%d:%02d:%02d\"", r / 3600, (r / 60) % 60, r % 60); cp += n; } else { n = sprintf(cp, ", \"run\":\"%d:%02d\"", (r / 60) % 60, r % 60); cp += n; } if (gps.ttff) { n = sprintf(cp, ", \"ttff\":\"%d:%02d\"", gps.ttff / 60, gps.ttff % 60); cp += n; } else { n = sprintf(cp, ", \"ttff\":null"); cp += n; } if (gps.StatDay != -1) { n = sprintf(cp, ", \"gpstime\":\"%s %02d:%02d:%02.0f\"", Week[gps.StatDay], hms.u, hms.m, hms.s); cp += n; } else { n = sprintf(cp, ", \"gpstime\":null"); cp += n; } if (gps.StatLat) { n = sprintf(cp, ", \"lat\":\"%8.6f %c\"", gps.StatLat, gps.StatNS); cp += n; n = sprintf(cp, ", \"lon\":\"%8.6f %c\"", gps.StatLon, gps.StatEW); cp += n; n = sprintf(cp, ", \"alt\":\"%1.0f m\"", gps.StatAlt); cp += n; n = sprintf(cp, ", \"map\":\"<a href='http://wikimapia.org/#lang=en&lat=%8.6f&lon=%8.6f&z=18&m=b' target='_blank'>wikimapia.org</a>\"", gps.sgnLat, gps.sgnLon); cp += n; } else { n = sprintf(cp, ", \"lat\":null"); cp += n; } n = sprintf(cp, ", \"acq\":%d, \"track\":%d, \"good\":%d, \"fixes\":%d, \"adc_clk\":%.6f, \"adc_corr\":%d", gps.acquiring? 1:0, gps.tracking, gps.good, gps.fixes, (adc_clock - adc_clock_offset)/1e6, gps.adc_clk_corr); cp += n; n = sprintf(cp, " }"); cp += n; send_encoded_msg_mc(conn->mc, "ADM", "gps_update", "%s", json_buf); continue; } i = strcmp(cmd, "SET sdr_hu_update"); if (i == 0) { gps_stats_t::gps_chan_t *c; char *cp = json_buf; n = sprintf(cp, "{ "); cp += n; if (gps.StatLat) { n = sprintf(cp, "\"lat\":\"%8.6f\", \"lon\":\"%8.6f\"", gps.sgnLat, gps.sgnLon); cp += n; } n = sprintf(cp, " }"); cp += n; send_encoded_msg_mc(conn->mc, "ADM", "sdr_hu_update", "%s", json_buf); continue; } int force_check; i = sscanf(cmd, "SET force_check=%d force_build=%d", &force_check, &force_build); if (i == 2) { check_for_update(force_check); continue; } i = strcmp(cmd, "SET reload_index_params"); if (i == 0) { reload_index_params(); continue; } i = strcmp(cmd, "SET extint_load_extension_configs"); if (i == 0) { extint_load_extension_configs(conn); continue; } i = strcmp(cmd, "SET restart"); if (i == 0) { lprintf("ADMIN: restart requested by admin..\n"); exit(0); } i = strcmp(cmd, "SET reboot"); if (i == 0) { lprintf("ADMIN: reboot requested by admin..\n"); system("reboot"); while (true) usleep(100000); } i = strcmp(cmd, "SET power_off"); if (i == 0) { lprintf("ADMIN: power off requested by admin..\n"); system("poweroff"); while (true) usleep(100000); } printf("ADMIN: unknown command: <%s>\n", cmd); continue; } conn->keep_alive = timer_sec() - ka_time; bool keepalive_expired = (conn->keep_alive > KEEPALIVE_SEC); if (keepalive_expired) { printf("ADMIN KEEP-ALIVE EXPIRED\n"); rx_server_remove(conn); return; } TaskSleep(250000); } }