コード例 #1
0
ファイル: boolean.c プロジェクト: kalyankondapally/soletta
static int
two_ports_process(struct sol_flow_node *node, void *data, uint16_t port_in, uint16_t port_out,
    const struct sol_flow_packet *packet, bool (*func) (bool in0, bool in1))
{
    int r;
    bool b;
    struct boolean_data *mdata = data;

    r = sol_flow_packet_get_boolean(packet, &b);
    SOL_INT_CHECK(r, < 0, r);

    if (port_in) {
        mdata->init_in1 = true;
        mdata->in1 = b;
    } else {
        mdata->init_in0 = true;
        mdata->in0 = b;
    }

    if (mdata->init_in0 && mdata->init_in1) {
        b = func(mdata->in0, mdata->in1);
        return sol_flow_send_boolean_packet(node, port_out, b);
    }

    return 0;
}
コード例 #2
0
ファイル: boolean-validator.c プロジェクト: gpaes/soletta
int
sequence_process(
    struct sol_flow_node *node,
    void *data,
    uint16_t port,
    uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    struct boolean_validator_data *mdata = data;
    char input;
    bool val, match;
    int r;

    if (mdata->done) {
        sol_flow_send_error_packet(node, ECANCELED,
            "Input stream already deviated from expected data, ignoring packets.");
        return 0;
    }

    r = sol_flow_packet_get_boolean(packet, &val);
    SOL_INT_CHECK(r, < 0, r);

    input = val ? 'T' : 'F';

    match = input == *mdata->it;

    mdata->it++;
    if (*mdata->it == '\0' || !match) {
        sol_flow_send_boolean_packet(node, SOL_FLOW_NODE_TYPE_TEST_BOOLEAN_VALIDATOR__OUT__OUT,
            match);
        mdata->done = true;
    }
    return 0;
}
コード例 #3
0
static int
engine_state_process(struct sol_flow_node *node, void *data,
    uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    int r;
    bool engine_is_on;
    struct sml_garden_data *sdata = data;
    time_t now = time(NULL);

    r = sol_flow_packet_get_boolean(packet, &engine_is_on);
    SOL_INT_CHECK(r, < 0, r);

    if (engine_is_on)
        sdata->btn_pressed_timestamp = now;
    else if (sdata->btn_pressed_timestamp) {
        now -= sdata->btn_pressed_timestamp;
        SOL_DBG("Pressed for:%ld seconds", now);
        if (sdata->last_engine_on_duration + now > ENGINE_DURATION_MAX_VAL)
            sdata->last_engine_on_duration = ENGINE_DURATION_MAX_VAL;
        else
            sdata->last_engine_on_duration += now;

        sdata->btn_pressed_timestamp = 0;
        r = send_packet_if_needed(node, sdata);
        SOL_INT_CHECK(r, < 0, r);
    }
コード例 #4
0
ファイル: unix-socket.c プロジェクト: ChunHungLiu/soletta
static int
boolean_writer_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct unix_socket_data *mdata = data;
    bool val;
    int r;

    r = sol_flow_packet_get_boolean(packet, &val);
    SOL_INT_CHECK(r, < 0, r);

    return unix_socket_write(mdata->un_socket, &val, sizeof(val));
}
コード例 #5
0
ファイル: boolean.c プロジェクト: kalyankondapally/soletta
/* NOT ********************************************************************/
static int
not_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    int r;
    bool in;

    r = sol_flow_packet_get_boolean(packet, &in);
    SOL_INT_CHECK(r, < 0, r);

    return sol_flow_send_boolean_packet(node, SOL_FLOW_NODE_TYPE_BOOLEAN_NOT__OUT__OUT, !in);
}
コード例 #6
0
ファイル: pwm-viewer.c プロジェクト: anselmolsm/soletta
int
gtk_pwm_viewer_enable_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    struct gtk_pwm_viewer_data *mdata = data;

    if (sol_flow_packet_get_type(packet) == SOL_FLOW_PACKET_TYPE_BOOLEAN) {
        bool value;
        int r = sol_flow_packet_get_boolean(packet, &value);
        SOL_INT_CHECK(r, < 0, r);
        mdata->enabled = value;
        gtk_widget_queue_draw(mdata->base.widget);
    } else {
コード例 #7
0
ファイル: boolean.c プロジェクト: kalyankondapally/soletta
static int
filter_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    bool packet_val;
    uint16_t out_port;
    int r;

    r = sol_flow_packet_get_boolean(packet, &packet_val);
    SOL_INT_CHECK(r, < 0, r);
    if (packet_val)
        out_port = SOL_FLOW_NODE_TYPE_BOOLEAN_FILTER__OUT__TRUE;
    else
        out_port = SOL_FLOW_NODE_TYPE_BOOLEAN_FILTER__OUT__FALSE;
    return sol_flow_send_boolean_packet(node, out_port, packet_val);
}
コード例 #8
0
static int
writer_in_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct writer_data *mdata = data;
    int r;
    bool in_value;

    r = sol_flow_packet_get_boolean(packet, &in_value);
    SOL_INT_CHECK(r, < 0, r);

    printf("%s=%s\n",
        mdata->prefix ? mdata->prefix : "writer",
        in_value ? "true" : "false");

    return 0;
}
コード例 #9
0
ファイル: boolean.c プロジェクト: kalyankondapally/soletta
static int
boolean_buffer_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    int r;
    struct boolean_buffer_data *mdata = data;

    r = sol_flow_packet_get_boolean(packet, &mdata->input_queue[mdata->cur_len]);
    SOL_INT_CHECK(r, < 0, r);

    if (mdata->n_samples <= ++mdata->cur_len) {
        r = _boolean_buffer_do(mdata);
        _reset(data);
    }

    return r;
}
コード例 #10
0
ファイル: timer.c プロジェクト: lpereira/soletta
static int
timer_enabled_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct timer_data *mdata = data;
    int r;
    bool val;

    r = sol_flow_packet_get_boolean(packet, &val);
    SOL_INT_CHECK(r, < 0, r);

    if (!val)
        return timer_stop(mdata);
    else if (!mdata->timer)
        return timer_start(mdata);

    return 0;
}
コード例 #11
0
ファイル: ipm.c プロジェクト: fuinha/soletta
static int
boolean_writer_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct ipm_data *mdata = data;
    struct sol_blob *blob;
    bool in_value;
    int r;

    r = sol_flow_packet_get_boolean(packet, &in_value);
    SOL_INT_CHECK(r, < 0, r);

    blob = SOL_BLOB_NEW_DUP(in_value);
    SOL_NULL_CHECK(blob, -ENOMEM);

    SEND_BLOB(blob, mdata->id, node);

    return 0;
}
コード例 #12
0
ファイル: result.c プロジェクト: ricardotk/soletta
int
test_result_process(
    struct sol_flow_node *node,
    void *data,
    uint16_t port,
    uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    bool passed = false;

    int r = sol_flow_packet_get_boolean(packet, &passed);

    SOL_INT_CHECK(r, < 0, r);

    if (passed)
        pass(node);
    else
        fail(node);
    return 0;
}
コード例 #13
0
ファイル: piezo-speaker.c プロジェクト: lgywata/soletta
static int
enabled_set(struct sol_flow_node *node,
    void *data,
    uint16_t port,
    uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    struct piezo_speaker_data *mdata = data;
    bool in_value;
    int r;

    r = sol_flow_packet_get_boolean(packet, &in_value);
    SOL_INT_CHECK(r, < 0, r);

    if (!in_value)
        return tune_stop(mdata);

    if (in_value && mdata->periods_us && !mdata->timer) {
        r = tune_start(mdata);
        SOL_INT_CHECK(r, < 0, r);
    }
コード例 #14
0
ファイル: boolean.c プロジェクト: kalyankondapally/soletta
static int
counter_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    struct sol_irange val = { 0, 0, INT32_MAX, 1 };
    struct counter_data *mdata = data;
    enum state *s;
    bool packet_val;
    int r;

    r = sol_flow_packet_get_boolean(packet, &packet_val);
    SOL_INT_CHECK(r, < 0, r);
    s = sol_vector_get(&mdata->map, conn_id);

    if (*s == packet_val)
        return 0;

    if (packet_val) {
        mdata->true_count++;
        if (*s != NA)
            mdata->false_count--;
    } else {
        mdata->false_count++;
        if (*s != NA)
            mdata->true_count--;
    }
    *s = packet_val;

    val.val = mdata->true_count;
    sol_flow_send_irange_packet(node, SOL_FLOW_NODE_TYPE_BOOLEAN_COUNTER__OUT__TRUE, &val);

    val.val = mdata->false_count;
    sol_flow_send_irange_packet(node, SOL_FLOW_NODE_TYPE_BOOLEAN_COUNTER__OUT__FALSE, &val);

    return 0;
}
コード例 #15
0
ファイル: inspector.c プロジェクト: ceolin/soletta
static void
inspector_show_packet_value(const struct sol_flow_packet *packet)
{
    const struct sol_flow_packet_type *type = sol_flow_packet_get_type(packet);

    if (type == SOL_FLOW_PACKET_TYPE_EMPTY) {
        fputs("<empty>", stdout);
        return;
    } else if (type == SOL_FLOW_PACKET_TYPE_ANY) {
        fputs("<any>", stdout);
        return;
    } else if (type == SOL_FLOW_PACKET_TYPE_ERROR) {
        int code;
        const char *msg;
        if (sol_flow_packet_get_error(packet, &code, &msg) == 0) {
            fprintf(stdout, "<error:%d \"%s\">", code, msg ? msg : "");
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_BOOLEAN) {
        bool v;
        if (sol_flow_packet_get_boolean(packet, &v) == 0) {
            fprintf(stdout, "<%s>", v ? "true" : "false");
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_BYTE) {
        unsigned char v;
        if (sol_flow_packet_get_byte(packet, &v) == 0) {
            fprintf(stdout, "<%#x>", v);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_IRANGE) {
        struct sol_irange v;
        if (sol_flow_packet_get_irange(packet, &v) == 0) {
            fprintf(stdout, "<val:%d|min:%d|max:%d|step:%d>",
                v.val, v.min, v.max, v.step);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_DRANGE) {
        struct sol_drange v;
        if (sol_flow_packet_get_drange(packet, &v) == 0) {
            fprintf(stdout, "<val:%g|min:%g|max:%g|step:%g>",
                v.val, v.min, v.max, v.step);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_STRING) {
        const char *v;
        if (sol_flow_packet_get_string(packet, &v) == 0) {
            fprintf(stdout, "<\"%s\">", v);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_BLOB) {
        struct sol_blob *v;
        if (sol_flow_packet_get_blob(packet, &v) == 0) {
            fprintf(stdout, "<mem=%p|size=%zd|refcnt=%hu|type=%p|parent=%p>",
                v->mem, v->size, v->refcnt, v->type, v->parent);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_JSON_OBJECT) {
        struct sol_blob *v;
        if (sol_flow_packet_get_json_object(packet, &v) == 0) {
            fprintf(stdout, "<%.*s>",
                SOL_STR_SLICE_PRINT(sol_str_slice_from_blob(v)));
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_JSON_ARRAY) {
        struct sol_blob *v;
        if (sol_flow_packet_get_json_array(packet, &v) == 0) {
            fprintf(stdout, "<%.*s>",
                SOL_STR_SLICE_PRINT(sol_str_slice_from_blob(v)));
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_RGB) {
        struct sol_rgb v;
        if (sol_flow_packet_get_rgb(packet, &v) == 0) {
            fprintf(stdout,
                "<red=%u|green=%u|blue=%u"
                "|red_max=%u|green_max=%u|blue_max=%u>",
                v.red, v.green, v.blue,
                v.red_max, v.green_max, v.blue_max);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_DIRECTION_VECTOR) {
        struct sol_direction_vector v;
        if (sol_flow_packet_get_direction_vector(packet, &v) == 0) {
            fprintf(stdout,
                "<x=%g|y=%g|z=%g|min=%g|max=%g>",
                v.x, v.y, v.z, v.min, v.max);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_LOCATION) {
        struct sol_location v;
        if (sol_flow_packet_get_location(packet, &v) == 0) {
            fprintf(stdout, "<lat=%g|lon=%g|alt=%g>", v.lat, v.lon, v.alt);
            return;
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_TIMESTAMP) {
        struct timespec v;
        if (sol_flow_packet_get_timestamp(packet, &v) == 0) {
            struct tm cur_time;
            char buf[32];
            tzset();
            if (gmtime_r(&v.tv_sec, &cur_time)) {
                if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ",
                    &cur_time) > 0) {
                    fprintf(stdout, "<%s>", buf);
                    return;
                }
            }
        }
    } else if (type == SOL_FLOW_PACKET_TYPE_HTTP_RESPONSE) {
        int code;
        const char *url, *content_type;
        const struct sol_blob *content;
        struct sol_vector headers, cookies;
        if (sol_flow_packet_get_http_response(packet, &code, &url,
            &content_type, &content, &cookies, &headers) == 0) {
            fprintf(stdout, "<response_code:%d|content type:%s|url:%s|",
                code, content_type, url);
            fprintf(stdout, "|cookies: {");
            inpector_print_key_value_array(&cookies);
            fprintf(stdout, "}|headers:{");
            inpector_print_key_value_array(&headers);
            fprintf(stdout,
                "}|content:{mem=%p|size=%zd|refcnt=%hu|type=%p|parent=%p}>",
                content->mem, content->size, content->refcnt,
                content->type, content->parent);
        }
        return;
    }

    fputs("<?>", stdout);
}
コード例 #16
0
ファイル: label.c プロジェクト: kalyankondapally/soletta
    uint16_t port,
    uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    struct gtk_common_data *mdata = data;

    if (sol_flow_packet_get_type(packet) == SOL_FLOW_PACKET_TYPE_EMPTY) {
        gtk_label_set_text(GTK_LABEL(mdata->widget), "[empty]");
    } else if (sol_flow_packet_get_type(packet) == SOL_FLOW_PACKET_TYPE_STRING) {
        const char *in_value;
        int r = sol_flow_packet_get_string(packet, &in_value);
        SOL_INT_CHECK(r, < 0, r);
        gtk_label_set_text(GTK_LABEL(mdata->widget), in_value);
    } else if (sol_flow_packet_get_type(packet) == SOL_FLOW_PACKET_TYPE_BOOLEAN) {
        bool value;
        int r = sol_flow_packet_get_boolean(packet, &value);
        SOL_INT_CHECK(r, < 0, r);
        gtk_label_set_text(GTK_LABEL(mdata->widget), value ? "ON" : "OFF");
    } else if (sol_flow_packet_get_type(packet) == SOL_FLOW_PACKET_TYPE_BYTE) {
        char buf[9];
        unsigned char value;
        int r = sol_flow_packet_get_byte(packet, &value), i;
        SOL_INT_CHECK(r, < 0, r);

        for (i = 7; i >= 0; i--) {
            buf[i] = (value & 0x1) + '0';
            value >>= 1;
        }
        buf[8] = '\0';
        gtk_label_set_text(GTK_LABEL(mdata->widget), buf);
    } else if (sol_flow_packet_get_type(packet) == SOL_FLOW_PACKET_TYPE_IRANGE) {
コード例 #17
0
ファイル: simplectype.c プロジェクト: ChunHungLiu/soletta
static int
mytype_func(struct sol_flow_node *node, const struct sol_flow_simplectype_event *ev, void *data)
{
    struct mytype_context *ctx = data;

    switch (ev->type) {
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_OPEN: {
        if (ev->options
#ifndef SOL_NO_API_VERSION
            && ev->options->sub_api == MYTYPE_OPTIONS_SUB_API
#endif
            ) {
            struct mytype_options *opt = (struct mytype_options *)ev->options;
            ctx->someint = opt->someint;
            ctx->somebool = opt->somebool;
        }
        /* every 500ms send out a string representing our someint + somebool */
        ctx->timer = sol_timeout_add(500, on_timeout, node);
        if (!ctx->timer)
            return -ENOMEM;
        printf("simplectype opened ctx=%p, someint=%d, somebool=%d\n",
            ctx, ctx->someint, ctx->somebool);
        return 0;
    }
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_CLOSE: {
        printf("simplectype closed ctx=%p\n", ctx);
        sol_timeout_del(ctx->timer);
        return 0;
    }
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_PORT_IN_PROCESS: {
        /* this is to show the port names, ideally one would keep the
         * indexes and use them here, doing integer comparisons
         * instead of strcmp()
         */
        if (strcmp(ev->port_name, "IRANGE") == 0) {
            int32_t val;
            if (sol_flow_packet_get_irange_value(ev->packet, &val) == 0) {
                printf("simplectype updated integer from %d to %d\n",
                    ctx->someint, val);
                ctx->someint = val;
                return 0;
            }
        } else if (strcmp(ev->port_name, "BOOLEAN") == 0) {
            bool val;
            if (sol_flow_packet_get_boolean(ev->packet, &val) == 0) {
                printf("simplectype updated boolean from %d to %d\n",
                    ctx->somebool, val);
                ctx->somebool = val;
                return 0;
            }
        }
        printf("simplectype port '%s' got unexpected data!\n", ev->port_name);
        return -EINVAL;
    }
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_PORT_IN_CONNECT:
        printf("simplectype port IN '%s' id=%d conn=%d connected ctx=%p\n",
            ev->port_name, ev->port, ev->conn_id, ctx);
        return 0;
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_PORT_IN_DISCONNECT:
        printf("simplectype port IN '%s' id=%d conn=%d disconnected ctx=%p\n",
            ev->port_name, ev->port, ev->conn_id, ctx);
        return 0;
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_PORT_OUT_CONNECT:
        printf("simplectype port OUT '%s' id=%d conn=%d connected ctx=%p\n",
            ev->port_name, ev->port, ev->conn_id, ctx);
        return 0;
    case SOL_FLOW_SIMPLECTYPE_EVENT_TYPE_PORT_OUT_DISCONNECT:
        printf("simplectype port OUT '%s' id=%d conn=%d disconnected ctx=%p\n",
            ev->port_name, ev->port, ev->conn_id, ctx);
        return 0;
    }

    return -EINVAL;
}