コード例 #1
0
ファイル: float.c プロジェクト: kalyankondapally/soletta
static int
constrain_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct drange_constrain_data *mdata = data;
    int r;
    struct sol_drange value;

    r = sol_flow_packet_get_drange(packet, &value);
    SOL_INT_CHECK(r, < 0, r);

    if (!mdata->use_input_range) {
        value.min = mdata->val.min;
        value.max = mdata->val.max;
        value.step = mdata->val.step;
    }

    r = _constrain(&value);
    SOL_INT_CHECK(r, < 0, r);

    mdata->val = value;

    return sol_flow_send_drange_packet(node,
        SOL_FLOW_NODE_TYPE_FLOAT_CONSTRAIN__OUT__OUT,
        &mdata->val);
}
コード例 #2
0
ファイル: float.c プロジェクト: kalyankondapally/soletta
static int
operator_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct drange_arithmetic_data *mdata = data;
    struct sol_drange value;
    int r;

    r = sol_flow_packet_get_drange(packet, &value);

    if (r < 0) {
        sol_flow_send_error_packet(node, -r, sol_util_strerrora(-r));
        return r;
    }

    if (port == 0) {
        mdata->var0 = value;
        mdata->var0_initialized = true;
    } else {
        mdata->var1 = value;
        mdata->var1_initialized = true;
    }

    /* wait until have both variables */
    if (!(mdata->var0_initialized && mdata->var1_initialized))
        return 0;

    r = mdata->func(&mdata->var0, &mdata->var1, &value);
    SOL_INT_CHECK(r, < 0, r);

    return sol_flow_send_drange_packet(node, mdata->port, &value);
}
コード例 #3
0
ファイル: float.c プロジェクト: kalyankondapally/soletta
static int
map_process(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct drange_map_data *mdata = data;
    struct sol_drange in_value;
    double out_value;
    int r;

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

    if (mdata->use_input_range) {
        if (isgreaterequal(in_value.min, in_value.max)) {
            SOL_WRN("Invalid range: input max must to be bigger than min");
            return -EINVAL;
        }
        r = _map(in_value.val, in_value.min, in_value.max, mdata->output.min,
            mdata->output.max, mdata->output_value.step, &out_value);
    } else
        r = _map(in_value.val, mdata->input.min, mdata->input.max,
            mdata->output.min, mdata->output.max, mdata->output_value.step,
            &out_value);

    SOL_INT_CHECK(r, < 0, r);

    mdata->output_value.val = out_value;

    return sol_flow_send_drange_packet(node,
        SOL_FLOW_NODE_TYPE_FLOAT_MAP__OUT__OUT,
        &mdata->output_value);
}
コード例 #4
0
ファイル: ipm.c プロジェクト: Learn-iot/soletta
static void
float_receiver(void *data, uint32_t id, struct sol_blob *message)
{
    struct sol_flow_node *node = data;

    sol_flow_send_drange_packet(node,
        SOL_FLOW_NODE_TYPE_IPM_FLOAT_READER__OUT__OUT, message->mem);
    sol_blob_unref(message);
}
コード例 #5
0
ファイル: float.c プロジェクト: kalyankondapally/soletta
static int
wave_generator_sinusoidal_process(struct sol_flow_node *node,
    void *data,
    uint16_t port,
    uint16_t conn_id,
    const struct sol_flow_packet *packet)
{
    struct drange_wave_generator_sinusoidal_data *mdata = data;

    sinusoidal_iterate(mdata);

    return sol_flow_send_drange_packet
               (node, SOL_FLOW_NODE_TYPE_WAVE_GENERATOR_SINUSOIDAL__OUT__OUT,
               &mdata->s_state.val);
}
コード例 #6
0
ファイル: random.c プロジェクト: amandawrcoelho/soletta
/*
 * WARNING: Do NOT use it for anything else than test purposes.
 */
static int
random_float_generate(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct random_node_data *mdata = data;
    struct sol_drange out_value = { 0, 0, INT32_MAX, 1 };
    int r;

    r = sol_random_get_double(mdata->engine, &out_value.val);
    if (r < 0)
        return r;

    return sol_flow_send_drange_packet(node,
        SOL_FLOW_NODE_TYPE_RANDOM_FLOAT__OUT__OUT,
        &out_value);
}
コード例 #7
0
ファイル: float-editor.c プロジェクト: Achint08/soletta
void
send_float_output(struct gtk_common_data *mdata)
{
    double value;
    struct sol_drange drange = SOL_DRANGE_INIT();
    int r;

    extract_value(mdata, &value, 1, "Float");
    drange.val = value;

    r = sol_flow_send_drange_packet(mdata->node,
        SOL_FLOW_NODE_TYPE_GTK_FLOAT_EDITOR__OUT__OUT, &drange);

    if (r < 0)
        SOL_WRN("Could not send the location packet. Reason: %s",
            sol_util_strerrora(-r));
}
コード例 #8
0
ファイル: constant.c プロジェクト: ChunHungLiu/soletta
static int
constant_drange_open(struct sol_flow_node *node, void *data, const struct sol_flow_node_options *options)
{
    const struct sol_flow_node_type_constant_float_options *opts;
    struct sol_drange value;
    int r;

    SOL_FLOW_NODE_OPTIONS_SUB_API_CHECK(options,
        SOL_FLOW_NODE_TYPE_CONSTANT_FLOAT_OPTIONS_API_VERSION, -EINVAL);
    opts = (const struct sol_flow_node_type_constant_float_options *)options;

    r = sol_drange_compose(&opts->value_spec, opts->value, &value);
    SOL_INT_CHECK(r, < 0, r);

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

    r = sol_flow_packet_get_drange(packet, &value);
    SOL_INT_CHECK(r, < 0, r);

    if (isgreaterequal(value.val, mdata->min) && islessequal(value.val, mdata->max)) {
        if (mdata->range_override) {
            value.min = mdata->min;
            value.max = mdata->max;
            value.step = 1;
        }
        return sol_flow_send_drange_packet(node, SOL_FLOW_NODE_TYPE_FLOAT_FILTER__OUT__OUT, &value);
    }
    return 0;
}
コード例 #10
0
ファイル: stts751.c プロジェクト: Learn-iot/soletta
static void
send_temperature(struct stts751_data *mdata)
{
    double temp;
    static const double steps[] = { 0.5, 0.25, 0.125, 0.0625 };
    struct sol_drange val = {
        .min = -64.0,
        .max = 127.9375,
        .step = steps[mdata->resolution - 9]
    };

    SOL_DBG("Temperature registers H:0x%x, L:0x%x", mdata->temp_h, mdata->temp_l);

    temp = mdata->temp_h;
    /* XXX Check if negative conversion is right */
    temp += ((double)(mdata->temp_l) / (1 << 8));

    /* To Kelvin */
    temp += 273.16;

    val.val = temp;

    sol_flow_send_drange_packet(mdata->node,
        SOL_FLOW_NODE_TYPE_STTS751__OUT__KELVIN, &val);
}

static void
read_cb(void *cb_data, struct sol_i2c *i2c, uint8_t reg,
    uint8_t *data, ssize_t status)
{
    struct stts751_data *mdata = cb_data;

    mdata->i2c_pending = NULL;
    if (status < 0) {
        const char errmsg[] = "Failed to read STTS751 temperature status";
        SOL_WRN(errmsg);
        sol_flow_send_error_packet(mdata->node, EIO, errmsg);
        mdata->reading_step = READING_NONE;
        return;
    }

    /* If reading status, let's check it */
    if (mdata->reading_step == READING_STATUS && mdata->status) {
        const char errmsg[] = "Invalid temperature status: 0x%x";
        SOL_WRN(errmsg, mdata->status);
        mdata->reading_step = READING_NONE;
        return;
    }

    /* Last step, send temperature */
    if (mdata->reading_step == READING_TEMP_L) {
        send_temperature(mdata);
        mdata->reading_step = READING_NONE;
        return;
    }

    mdata->reading_step++;
    stts751_read(mdata);
}

static bool
stts751_read(void *data)
{
    struct stts751_data *mdata = data;
    uint8_t reg, *dst;

    mdata->timer = NULL;

    if (!set_slave(mdata, stts751_read))
        return false;

    switch (mdata->reading_step) {
    case READING_STATUS:
        reg = STATUS_REGISTER;
        dst = &mdata->status;
        break;
    case READING_TEMP_H:
        reg = TEMPERATURE_REGISTER_H;
        dst = (uint8_t *)&mdata->temp_h;
        break;
    case READING_TEMP_L:
        reg = TEMPERATURE_REGISTER_L;
        dst = &mdata->temp_l;
        break;
    default:
        SOL_WRN("Invalid reading step");
        return false;
    }

    mdata->i2c_pending = sol_i2c_read_register(mdata->i2c, reg,
        dst, sizeof(*dst), read_cb, mdata);

    if (!mdata->i2c_pending) {
        const char errmsg[] = "Failed to read STTS751 temperature";
        SOL_WRN(errmsg);
        sol_flow_send_error_packet(mdata->node, EIO, errmsg);
        mdata->reading_step = READING_NONE;
    }

    return false;
}

static int
temperature_stts751_tick(struct sol_flow_node *node, void *data, uint16_t port, uint16_t conn_id, const struct sol_flow_packet *packet)
{
    struct stts751_data *mdata = data;

    if (mdata->reading_step != READING_NONE) {
        SOL_WRN("Reading operation in progress, discading TICK");
        return 0;
    }
    /* First, read the status, if it's ok, then we read temp high and low */
    mdata->reading_step = READING_STATUS;
    stts751_read(mdata);

    return 0;
}