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; }
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; }