¿Cómo obtener la variable de la función de devolución de llamada?
Hay una biblioteca davetcc / IoAbstraction . La única biblioteca que funciona como se esperaba con mi codificador rotatorio. El problema es que en la rotación solo puedo ver la salida en serie con datos de posición, pero no puedo obtener estos datos como un valor variable.
Existe la inicialización del conmutador y la definición de la función en main.cpp switches.addSwitch(spinwheelClickPin, onSpinwheelClicked);
void onSpinwheelClicked(uint8_t pin, bool heldDown) {
Serial.print("Button pressed ");
Serial.println(heldDown ? "Held" : "Pressed");
}
La definición de SwitchInput.cpp
bool SwitchInput::addSwitch(pinid_t pin, KeyCallbackFn callback,uint8_t repeat, bool invertLogic) {
if(internalAddSwitch(pin, invertLogic)) {
KeyboardItem item(pin, callback, repeat, invertLogic);
return keys.add(item);
}
return false;
}
Existe la definición del tipo de función de devolución de llamada de SwitchInput.h
typedef void(*KeyCallbackFn)(pinid_t key, bool heldDown);
Canon simplemente cambio void a bool. Entonces, ¿cómo puedo obtener este heldDownvalor de variable?
Perdón si la pregunta es estúpida.
Respuestas
Las funciones de devolución de llamada generalmente son voidy no devuelven datos reales, porque son llamadas por algún tipo de sistema de manejo de eventos, como la biblioteca mencionada. Como esto está llamando a la función de devolución de llamada, no a usted, no tiene mucho sentido devolver datos desde ella. Para obtener ese valor de retorno, necesitaría cambiar la biblioteca para cada bit de datos que desee. Por lo tanto, los valores de retorno de las funciones de devolución de llamada son voido algún mensaje al sistema de manejo de eventos (por ejemplo, para hacer que el sistema de eventos envíe el evento al siguiente manejador posible).
Pero puede usar variables globales para obtener los datos de la devolución de llamada. Defina una variable global para el valor que desea extraer y, dentro de la función de devolución de llamada, establezca esa variable. Luego, en otros lugares de su código, puede usar esa variable global.
La biblioteca que vinculó parece manejar el evento en el código principal y no en interrupciones. Por lo tanto, puede usar las variables globales como desee.
Aunque debe ser completo: cuando hay interrupciones involucradas y cambia variables globales dentro de una rutina de servicio de interrupciones, debe tener mucho cuidado. Las variables de un solo byte no son un problema, pero con las variables de varios bytes puede obtener datos codificados, ya que la interrupción puede ocurrir en medio del procesamiento de esa variable. Luego, debe introducir una sección crítica, donde las interrupciones se desactivan por un tiempo muy corto.