示例#1
0
文件: aio.c 项目: NilayNigam/soletta
static int
aio_reader_open(struct sol_flow_node *node, void *data, const struct sol_flow_node_options *options)
{
    int device, pin;
    struct aio_data *mdata = data;
    const struct sol_flow_node_type_aio_reader_options *opts =
        (const struct sol_flow_node_type_aio_reader_options *)options;

    SOL_FLOW_NODE_OPTIONS_SUB_API_CHECK(opts,
        SOL_FLOW_NODE_TYPE_AIO_READER_OPTIONS_API_VERSION, -EINVAL);

    mdata->aio = NULL;
    mdata->is_first = true;
    mdata->node = node;

    if (!opts->pin || *opts->pin == '\0') {
        SOL_WRN("aio: Option 'pin' cannot be neither 'null' nor empty.");
        return -EINVAL;
    }

    if (opts->mask <= 0) {
        SOL_WRN("aio (%s): Invalid bit mask value=%" PRId32 ".", opts->pin, opts->mask);
        return -EINVAL;
    }

    if (opts->poll_timeout <= 0) {
        SOL_WRN("aio (%s): Invalid polling time=%" PRId32 ".", opts->pin, opts->poll_timeout);
        return -EINVAL;
    }

    if (opts->raw) {
        if (sscanf(opts->pin, "%d %d", &device, &pin) == 2) {
            mdata->aio = sol_aio_open(device, pin, opts->mask);
        } else {
            SOL_WRN("aio (%s): 'raw' option was set, but 'pin' value=%s couldn't be parsed as "
                "\"<device> <pin>\" pair.", opts->pin, opts->pin);
        }
    } else {
        mdata->aio = sol_aio_open_by_label(opts->pin, opts->mask);
    }

    SOL_NULL_CHECK_MSG(mdata->aio, -EINVAL,
        "aio (%s): Couldn't be open. Maybe you used an invalid 'pin'=%s?", opts->pin, opts->pin);

    mdata->pin = opts->pin ? strdup(opts->pin) : NULL;
    mdata->mask = (0x01 << opts->mask) - 1;
    mdata->timer = sol_timeout_add(opts->poll_timeout, _on_reader_timeout, mdata);

    return 0;
}
示例#2
0
SOL_API struct sol_aio *
sol_aio_open_by_label(const char *label, unsigned int precision)
{
#ifdef USE_PIN_MUX
    int device, pin;
#endif

    _log_init();

#ifdef USE_PIN_MUX
    if (!sol_pin_mux_map(label, SOL_IO_AIO, &device, &pin))
        return sol_aio_open(device, pin, precision);

    SOL_WRN("Label '%s' couldn't be mapped or can't be used as Analog I/O", label);
#else
    SOL_INF("Pin Multiplexer support is necessary to open a 'board pin'.");
#endif

    return NULL;
}