SJ_PRIVATE enum v7_err Http_response_writeHead(struct v7 *v7, v7_val_t *res) { enum v7_err rcode = V7_OK; DECLARE_CONN(); unsigned long code = 200; v7_val_t arg0 = v7_arg(v7, 0), arg1 = v7_arg(v7, 1); if (v7_is_truthy(v7, v7_get(v7, v7_get_this(v7), "_whd", ~0))) { rcode = v7_throwf(v7, "Error", "Headers already sent"); goto clean; } if (v7_is_number(arg0)) { code = v7_to_number(arg0); } write_http_status(c, code); http_write_headers(v7, arg1, c); mg_send(c, "\r\n", 2); v7_set(v7, v7_get_this(v7), "_whd", ~0, v7_mk_boolean(1)); *res = v7_get_this(v7); clean: return rcode; }
static enum v7_err UART_setRXEnabled(struct v7 *v7, v7_val_t *res) { struct esp_sj_uart_state *us; enum v7_err ret = esp_sj_uart_get_state(v7, &us); if (ret != V7_OK) return ret; esp_uart_set_rx_enabled(us->uart_no, v7_is_truthy(v7, v7_arg(v7, 0))); esp_sj_uart_schedule_dispatcher(us->uart_no); *res = v7_mk_undefined(); return V7_OK; }
/* Args: callable, disable_rx */ static enum v7_err UART_onRecv(struct v7 *v7, v7_val_t *res) { struct esp_sj_uart_state *us; enum v7_err ret = esp_sj_uart_get_state(v7, &us); if (ret != V7_OK) return ret; v7_set(v7, us->obj, "_rxcb", 5, v7_arg(v7, 0)); esp_uart_set_rx_enabled(us->uart_no, !v7_is_truthy(v7, v7_arg(v7, 1))); if (v7_is_callable(v7, v7_arg(v7, 0))) { esp_sj_uart_schedule_dispatcher(us->uart_no); } *res = v7_mk_undefined(); return V7_OK; }
SJ_PRIVATE enum v7_err Http_response_write(struct v7 *v7, v7_val_t *res) { enum v7_err rcode = V7_OK; DECLARE_CONN(); if (!v7_is_truthy(v7, v7_get(v7, v7_get_this(v7), "_whd", ~0))) { write_http_status(c, 200); mg_send(c, "\r\n", 2); v7_set(v7, v7_get_this(v7), "_whd", ~0, v7_mk_boolean(1)); } Http_write_data(v7, c); *res = v7_get_this(v7); clean: return rcode; }
SJ_PRIVATE enum v7_err sj_Wifi_setup(struct v7 *v7, v7_val_t *res) { enum v7_err rcode = V7_OK; v7_val_t ssidv = v7_arg(v7, 0); v7_val_t passv = v7_arg(v7, 1); v7_val_t extrasv = v7_arg(v7, 2); const char *ssid, *pass; size_t ssid_len, pass_len; int permanent = 1, ret = 0; if (!v7_is_string(ssidv) || !v7_is_string(passv)) { printf("ssid/pass are not strings\n"); *res = V7_UNDEFINED; goto clean; } if (v7_is_object(extrasv)) { permanent = v7_is_truthy(v7, v7_get(v7, extrasv, "permanent", ~0)); } ssid = v7_get_string(v7, &ssidv, &ssid_len); pass = v7_get_string(v7, &passv, &pass_len); struct sys_config_wifi_sta cfg; memset(&cfg, 0, sizeof(cfg)); cfg.ssid = (char *) ssid; cfg.pass = (char *) pass; LOG(LL_INFO, ("WiFi: connecting to '%s'", ssid)); ret = sj_wifi_setup_sta(&cfg); if (ret && permanent) { struct sys_config *cfg = get_cfg(); cfg->wifi.sta.enable = 1; sj_conf_set_str(&cfg->wifi.sta.ssid, ssid); sj_conf_set_str(&cfg->wifi.sta.pass, pass); } *res = v7_mk_boolean(v7, ret); goto clean; clean: return rcode; }
SJ_PRIVATE enum v7_err GPIO_write(struct v7 *v7, v7_val_t *res) { v7_val_t pinv = v7_arg(v7, 0); v7_val_t valv = v7_arg(v7, 1); int pin, val; if (!v7_is_number(pinv)) { printf("non-numeric pin\n"); *res = v7_mk_undefined(); } else { pin = v7_to_number(pinv); /* * We assume 0 if the value is "falsy", * and 1 if the value is "truthy" */ val = !!v7_is_truthy(v7, valv); *res = v7_mk_boolean(sj_gpio_write(pin, val) == 0); } return V7_OK; }
SJ_PRIVATE enum v7_err GPIO_write(struct v7 *v7, v7_val_t *res) { v7_val_t pinv = v7_arg(v7, 0); v7_val_t valv = v7_arg(v7, 1); int pin, val; if (!v7_is_number(pinv)) { printf("non-numeric pin\n"); *res = V7_UNDEFINED; } else { pin = v7_get_double(v7, pinv); /* * We assume 0 if the value is "falsy", * and 1 if the value is "truthy" */ val = !!v7_is_truthy(v7, valv); *res = v7_mk_boolean( v7, sj_gpio_write(pin, val ? GPIO_LEVEL_HIGH : GPIO_LEVEL_LOW) == 0); } return V7_OK; }