Estoy escribiendo un nuevo proyecto de Arduino que utiliza una pantalla de cristal LCD de 16x2 con KeyShield. Me gustaría construir una estructura de menú en la que el usuario pueda navegar usando los botones.
Soy nuevo en Arduino pero tengo 5 años de experiencia en C#. Lo que me gustaría hacer es lo siguiente:
Defina una interfaz llamada Screen
y herede cada Pantalla de ella, como LanguageScreen
, TurnOffAfterScreen
, MainScreen
, etc. Cada Pantalla especializada implementa un método llamado drawScreen
que se encargará del contenido de la pantalla.
Ahora me gustaría tener una clase nombrada ScreenController
que maneje la navegación entre las pantallas. En esta clase, me gustaría almacenar las pantallas en una matriz Screen screens[3]
.
Cuando el usuario presiona el Select
botón en KeyShield, el controlador llamará al siguiente drawScreen
método de pantalla de la siguiente manera:
void showNextScreen()
{
currentScreen++;
screens[currentScreen]->drawScreen();
}
¿Es esto posible de hacer en un proyecto Arduino? ¿Estoy esperando demasiado? :)
class Screen {
public:
virtual void drawScreen() = 0; // Needs to be implemented by each subclass
virtual ~Screen() {} // Destructor
};
class LanguageScreen : public Screen {
public:
virtual void drawScreen();
};
class MainScreen : public Screen {
public:
virtual void drawScreen();
};
void LanguageScreen::drawScreen() {
// Draw language screen
}
void MainScreen::drawScreen() {
// Draw main screen
}
MainScreen mainScreen;
LanguageScreen languageScreen;
Screen *const screens[2] = {&mainScreen, &languageScreen};
int currenScreen = 0;
class Screen { public: virtual void drawScreen() = 0; // Needs to be implemented by each subclass virtual ~Screen() {} // Destructor }; class LanguageScreen : public Screen { // I didn't define the void drawScreen(); };
Entonces, en realidad quiero recibir un mensaje de que falta el método drawScreen() en la clase LanguageScreen ya que implementa la pantalla de clase de "interfaz". ¿O es esto diferente a PHP?= 0;
en la declaración original también garantizará un mensaje de error si intenta usar una subclase que no implementa drawScreen
. La diferencia es que puede heredar en varios niveles, y solo uno de ellos necesita implementar el método.El uso de clases de C++ en un microcontrolador con memoria limitada generalmente no se considera una estrategia de desarrollo viable. Hay formas literalmente ilimitadas en las que puede construir un "sistema de menús" en una pantalla sin tener que recurrir al estilo de programación OOP intensivo en recursos.
Editar: estoy sorprendido por la reacción del lector al poner muchos votos negativos en mi respuesta. Puedo decirle que con más de 30 años de experiencia en el desarrollo de soluciones de código y firmware para microcontroladores de muchos tipos, la declaración de mi respuesta es cierta. Hay muchas aplicaciones que usan MCU de bajo rendimiento (en comparación con sus hermanos mayores en PC y similares) donde el programa a veces incluso necesita codificarse en lenguaje ensamblador para realizar el trabajo de manera eficiente y con baja latencia.
microterio
Screen
tendría que ser una clase base (abstracta), y su matriz tendría que serScreen * screens[3]
.papayatis
microterio