/* * Usage: * * new UART("platform_specific_name") * */ static enum v7_err UART_ctor(struct v7 *v7, v7_val_t *res) { enum v7_err rcode = V7_OK; v7_val_t this_obj = v7_get_this(v7); v7_val_t dev = v7_arg(v7, 0); struct user_data *ud; void *uart; const char *name; size_t len; if (!v7_is_string(dev)) { rcode = v7_throwf(v7, "Error", "device must be string"); goto clean; } ud = (struct user_data *) calloc(1, sizeof(struct user_data)); ud->v7 = v7; ud->want = 0; ud->cb = v7_create_undefined(); v7_own(v7, &ud->cb); name = v7_get_string_data(v7, &dev, &len); uart = sj_hal_open_uart(name, (void *) ud); if (uart == NULL) { rcode = v7_throwf(v7, "Error", "cannot open uart"); goto clean; } v7_set(v7, this_obj, "_ud", ~0, V7_PROPERTY_HIDDEN, v7_create_foreign(ud)); v7_set(v7, this_obj, "_dev", ~0, V7_PROPERTY_HIDDEN, v7_create_foreign(uart)); clean: return rcode; }
static void ws_ev_handler(struct ns_connection *nc, int ev, void *ev_data) { struct websocket_message *wm = (struct websocket_message *) ev_data; struct user_data *ud = (struct user_data *) nc->user_data; struct v7 *v7 = ud->v7; switch (ev) { case NS_CONNECT: if (*(int *) ev_data == 0) { char *proto = NULL; if (ud->proto != NULL) { int tmp = asprintf(&proto, "Sec-WebSocket-Protocol: %s\n", ud->proto); (void) tmp; /* Shutup compiler */ } ns_send_websocket_handshake(nc, "/", proto); if (proto != NULL) { free(proto); } } else { invoke_cb(ud, "onerror", v7_create_null()); } break; case NS_WEBSOCKET_HANDSHAKE_DONE: v7_set(v7, ud->ws, "_nc", ~0, V7_PROPERTY_HIDDEN, v7_create_foreign(nc)); invoke_cb(ud, "onopen", v7_create_null()); break; case NS_WEBSOCKET_FRAME: { v7_val_t ev, data; ev = v7_create_object(v7); v7_own(v7, &ev); data = v7_create_string(v7, (char *) wm->data, wm->size, 1); v7_set(v7, ev, "data", ~0, 0, data); invoke_cb(ud, "onmessage", ev); v7_disown(v7, &ev); break; } case NS_CLOSE: invoke_cb(ud, "onclose", v7_create_null()); nc->user_data = NULL; v7_set(v7, ud->ws, "_nc", ~0, V7_PROPERTY_HIDDEN, v7_create_undefined()); v7_disown(v7, &ud->ws); free(ud); break; } }