static void websocket_refresh(struct worker* client, struct var* set[], size_t n){ struct json_object* root = json_object_new_object(); json_object_object_add(root, "vars", serialize_vars_set(SERIALIZE_SLIM, set, n)); json_object_object_add(root, "type", json_object_new_string("refresh")); const char* data = json_object_to_json_string_ext(root, 0); websocket_send(client, data, strlen(data)); json_object_put(root); }
static void websocket_hello(struct worker* client){ struct json_object* root = json_object_new_object(); json_object_object_add(root, "vars", serialize_vars_all(SERIALIZE_FULL)); json_object_object_add(root, "type", json_object_new_string("hello")); const char* data = json_object_to_json_string_ext(root, 0); websocket_send(client, data, strlen(data)); json_object_put(root); }
void controller_execute(controller ctrl) { struct timespec time; float dt; char header[2048]; size_t header_size = 0; int16_t * data; int data_len; size_t data_size; clock_gettime(CLOCK_REALTIME_COARSE, & time); // time (secs) since last heartbeat dt = (time.tv_sec - ctrl->heartbeat_time.tv_sec); dt += (time.tv_nsec - ctrl->heartbeat_time.tv_nsec) / 1e9; if (dt >= 0.25f) { _controller_create_header(ctrl, header, & header_size); // reset sample count ctrl->heartbeat_num_samples = 0; // update time ctrl->heartbeat_time.tv_sec = time.tv_sec; ctrl->heartbeat_time.tv_nsec = time.tv_nsec; } // give control to the scanner scanner_execute(ctrl->scan, ctrl->dem, ctrl->r); // block until new output is available demod_pop_and_lock(ctrl->dem, & data, & data_len); data_size = data_len * sizeof(int16_t); // send to client websocket_send(ctrl->ws, header, header_size, data, data_size); demod_release(ctrl->dem); // keep count ctrl->heartbeat_num_samples += data_len; }
static int tapi2p_callback(struct libwebsocket_context *ctx, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void* user, void* in, size_t len) { switch(reason) { case LWS_CALLBACK_ESTABLISHED: lwsl_notice("Handshaked with client.\n"); libwebsocket_callback_on_writable(ctx, wsi); break; case LWS_CALLBACK_SERVER_WRITEABLE: { if(corefd==-1) { char* conn_reply="Could not connect to tapi2p. Is tapi2p core running?"; websocket_send(wsi, conn_reply, strlen(conn_reply)); } else if(!welcome_message_sent) { struct config* conf=getconfig(); if(conf) { struct configitem* ci=config_find_item(conf, "Nick", "Account"); if(ci && ci->val) { json_t *root=json_object(); json_object_set_new(root, "cmd", json_integer(Message)); json_object_set_new(root, "data", json_string("Welcome to tapi2p, ")); json_object_set_new(root, "own_nick", json_string(ci->val)); char *jsonstr=json_dumps(root, 0); welcome_message_sent=1; websocket_send(wsi, jsonstr, strlen(jsonstr)); free(jsonstr); json_decref(root); lwsl_notice("Sent welcome message.\n"); } } } else if(unsent_data>0) { pthread_mutex_lock(&datalock); while(unsent_data) { char* data=data_to_send[--unsent_data]; printf("Sent: %s\n", data); websocket_send(wsi, data, strlen(data)); free(data); } pthread_mutex_unlock(&datalock); } usleep(10000); libwebsocket_callback_on_writable(ctx, wsi); break; } case LWS_CALLBACK_CLOSED: lwsl_notice("Connection to client closed.\n"); break; case LWS_CALLBACK_RECEIVE: lwsl_notice("Message from client\n"); printf("Json: %s %d\n", (char*)in, len); send_json((char*) in, len); break; } return 0; }