ich habe schon wieder eine Frage an euch. Ich habe eigentlich gar keinen Anwendungsfall dafür, bin aber darüber gestolpert und hänge seit dem fest.
Um GPIO's am Raspberry zu steuern gibt es unter anderem `libgpiod und um `libgpiod` mit Python verwenden können gibt es `Python-gpiod. `Python-gpiod` ist meiner Meinung nach nicht so schön dokumentiert und ich weis das ich auch `gpiozero` mit `libgpiod` verwenden kann und das wunderschön dokumentiert ist, aber so eine schöne Alternative ist ja nicht immer gegeben.
`Python-gpiod` hat auf Github dieses Beispiel :
Code: Alles auswählen
#!/usr/bin/env python3
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of libgpiod.
#
# Copyright (C) 2017-2018 Bartosz Golaszewski <bartekgola@gmail.com>
#
'''Simplified reimplementation of the gpioset tool in Python.'''
import gpiod
import sys
if __name__ == '__main__':
if len(sys.argv) < 3:
raise TypeError('usage: gpioset.py <gpiochip> <offset1>=<value1> ...')
with gpiod.Chip(sys.argv[1]) as chip:
offsets = []
values = []
for arg in sys.argv[2:]:
arg = arg.split('=')
offsets.append(int(arg[0]))
values.append(int(arg[1]))
lines = chip.get_lines(offsets)
lines.request(consumer=sys.argv[0], type=gpiod.LINE_REQ_DIR_OUT)
lines.set_values(values)
input()
Code: Alles auswählen
static PyMethodDef gpiod_Chip_methods[] = {
....
{
.ml_name = "get_lines",
.ml_meth = (PyCFunction)gpiod_Chip_get_lines,
.ml_flags = METH_VARARGS,
.ml_doc = gpiod_Chip_get_lines_doc,
},
...
Im Sourcecode von `gpiodmodule.c` habe ich dann hier diese Funktion gefunden:
Code: Alles auswählen
PyDoc_STRVAR(gpiod_Chip_get_lines_doc,
"get_lines(offsets) -> gpiod.LineBulk object\n"
"\n"
"Get a set of GPIO lines by their offsets.\n"
"\n"
" offsets\n"
" List of lines offsets.");
static gpiod_LineBulkObject *
gpiod_Chip_get_lines(gpiod_ChipObject *self, PyObject *args)
{
PyObject *offsets, *iter, *next, *lines, *arg;
gpiod_LineBulkObject *bulk;
Py_ssize_t num_offsets, i;
gpiod_LineObject *line;
int rv;
rv = PyArg_ParseTuple(args, "O", &offsets);
if (!rv)
return NULL;
num_offsets = PyObject_Size(offsets);
if (num_offsets < 1) {
PyErr_SetString(PyExc_TypeError,
"Argument must be a non-empty sequence of offsets");
return NULL;
}
lines = PyList_New(num_offsets);
if (!lines)
return NULL;
iter = PyObject_GetIter(offsets);
if (!iter) {
Py_DECREF(lines);
return NULL;
}
for (i = 0;;) {
next = PyIter_Next(iter);
if (!next) {
Py_DECREF(iter);
break;
}
arg = PyTuple_Pack(1, next);
Py_DECREF(next);
if (!arg) {
Py_DECREF(iter);
Py_DECREF(lines);
return NULL;
}
line = gpiod_Chip_get_line(self, arg);
Py_DECREF(arg);
if (!line) {
Py_DECREF(iter);
Py_DECREF(lines);
return NULL;
}
rv = PyList_SetItem(lines, i++, (PyObject *)line);
if (rv < 0) {
Py_DECREF(line);
Py_DECREF(iter);
Py_DECREF(lines);
return NULL;
}
}
bulk = gpiod_ListToLineBulk(lines);
Py_DECREF(lines);
if (!bulk)
return NULL;
return bulk;
}
Kann mir bitte jemand an diesem Beispiel erklären, wie man da vorgeht? Wie finde ich die Zusammenhänge raus und kann das auf einen Python-Code übertragen?
Um vielleicht noch etwas meine Gründe zu verstehen, wieso ich da den Zusammenhang suche. Das gezeigte Beispiel hilft mir in soweit das ich damit eine bspw. LED oder so steuern könnte. Aber was wäre, wenn ich einen Button steuern will und den internen Pull-up setzen will. In der libgpiod Doku habe ich das gefunden, aber solange ich die Zusammenhänge nicht verstehe, werde ich nicht rausfinden können, wie der Python-Code aussehen muss, damit der Pull-up gesetzt wird.
Ich hoffe ihr könnt meine Verwirrung verstehen und wir können das hier verwenden um mich diesem Thema etwas näher zu bringen.
Vielen lieben Dank und Grüße
Dennis