/**
* \file liblvgl/llemu.hpp
*
* \ingroup cpp-llemu
*
* Legacy LCD Emulator
*
* \details This file defines a high-level API for emulating the three-button, UART-based
* VEX LCD, containing a set of functions that facilitate the use of a software-
* emulated version of the classic VEX LCD module.
*
* Visit https://pros.cs.purdue.edu/v5/tutorials/topical/adi.html to learn more.
*
* This file should not be modified by users, since it gets replaced whenever
* a kernel upgrade occurs.
*
* \copyright (c) 2017-2023, Purdue University ACM SIGBots.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* \defgroup cpp-llemu LLEMU C++ API
* @{
* LLEMU - Legacy Lcd EMUlator
*
* \image html llemu/llemu-3.8.png
*
* LLEMU provides a virtual 40x8 LCD screen with 3 buttons. The user can set the
* text of the screen and set create functions that are run when the buttons are
* pressed.
*
* LLEMU is a emulation of the UART-based LCD screens that were available with
* VEX's cortex product line.
* @}
*/
#ifndef _LIBLVGL_LLEMU_HPP_
#define _LIBLVGL_LLEMU_HPP_
#include
#include
#include "liblvgl/llemu.h"
namespace pros {
/**
* \ingroup cpp-llemu
*/
namespace lcd {
/**
* \ingroup cpp-llemu
*/
/**
* \addtogroup cpp-llemu
* @{
*/
/**
* \enum Text_Align
*
* @brief Represents how to align the text in the LCD
*/
enum class Text_Align {
/// Align the text to the left side of LCD line
LEFT = 0,
/// Align the text to the center of the LCD line
CENTER = 1,
/// Align the text to the right side of the LCD line
RIGHT = 2
};
/**
* Checks whether the emulated three-button LCD has already been initialized.
*
* \return True if the LCD has been initialized or false if not.
*
* \b Example
* \code
* if (pros::lcd::is_initialized()) {
* pros::lcd::print("LLEMU!");
* }
* else {
* printf("Error: LLEMU is not initialized\n");
* }
* \endcode
*/
bool is_initialized(void);
/**
* Creates an emulation of the three-button, UART-based VEX LCD on the display.
*
* \return True if the LCD was successfully initialized, or false if it has
* already been initialized.
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void initialize() {
* if (pros::lcd::initialize()) {
* pros::lcd::print("LLEMU!");
* }
* else {
* printf("Error: LLEMU could not initailize\n");
* }
* }
* \endcode
*/
bool initialize(void);
/**
* Turns off the Legacy LCD Emulator.
*
* Calling this function will clear the entire display, and you will not be able
* to call any further LLEMU functions until another call to lcd_initialize.
*
* This function uses the following values of errno when an error state is
* reached:
* ENXIO - The LCD has not been initialized. Call lcd_initialize() first.
*
* \return True if the operation was successful, or false otherwise, setting
* errno values as specified above.
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void disabled() {
* pros::lcd::shutdown();
* }
* \endcode
*/
bool shutdown(void);
/**
* Displays a string on the emulated three-button LCD screen.
*
* This function uses the following values of errno when an error state is
* reached:
* ENXIO - The LCD has not been initialized. Call lcd_initialize() first.
* EINVAL - The line number specified is not in the range [0-7]
*
* \param line
* The line on which to display the text [0-7]
* \param text
* The text to display
*
* \return True if the operation was successful, or false otherwise, setting
* errno values as specified above.
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::set_text(0, "My custom LLEMU text!");
* }
* \endcode
*/
bool set_text(std::int16_t line, std::string text);
/**
* Clears the contents of the emulated three-button LCD screen.
*
* This function uses the following values of errno when an error state is
* reached:
* ENXIO - The LCD has not been initialized. Call lcd_initialize() first.
* EINVAL - The line number specified is not in the range [0-7]
*
* \return True if the operation was successful, or false otherwise, setting
* errno values as specified above.
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::clear(); // Clear the LCD screen
* }
* \endcode
*/
bool clear(void);
/**
* Clears the contents of a line of the emulated three-button LCD screen.
*
* This function uses the following values of errno when an error state is
* reached:
* ENXIO - The LCD has not been initialized. Call lcd_initialize() first.
* EINVAL - The line number specified is not in the range [0-7]
*
* \param line
* The line to clear
*
* \return True if the operation was successful, or false otherwise, setting
* errno values as specified above.
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::clear_line(0); // Clear line 0
* }
* \endcode
*/
bool clear_line(std::int16_t line);
using lcd_btn_cb_fn_t = void (*)(void);
/**
* Registers a callback function for the leftmost button.
*
* When the leftmost button on the emulated three-button LCD is pressed, the
* user-provided callback function will be invoked.
*
* \param cb
* A callback function of type lcd_btn_cb_fn_t(void (*cb)(void))
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void left_callback() {
* static int i = 0;
*
* pros::lcd::print(0, "Left button pressed %i times", i);
* i++
* }
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::register_btn0_cb();
* }
* \endcode
*/
void register_btn0_cb(lcd_btn_cb_fn_t cb);
/**
* Registers a callback function for the center button.
*
* When the center button on the emulated three-button LCD is pressed, the
* user-provided callback function will be invoked.
*
* \param cb
* A callback function of type lcd_btn_cb_fn_t(void (*cb)(void))
*
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void center_callback() {
* static int i = 0;
*
* pros::lcd::print(0, "Center button pressed %i times", i);
* i++
* }
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::register_btn1_cb();
* }
* \endcode
*/
void register_btn1_cb(lcd_btn_cb_fn_t cb);
/**
* Registers a callback function for the rightmost button.
*
* When the rightmost button on the emulated three-button LCD is pressed, the
* user-provided callback function will be invoked.
*
* \param cb
* A callback function of type lcd_btn_cb_fn_t(void (*cb)(void))
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void right_callback() {
* static int i = 0;
*
* pros::lcd::print(0, "Right button pressed %i times", i);
* i++
* }
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::register_btn2_cb();
* }
* \endcode
*/
void register_btn2_cb(lcd_btn_cb_fn_t cb);
/**
* Sets the alignment to use for subsequent calls that print text to a line.
*
* \param alignment
* An enum specifying the alignment. Available alignments are:
* TEXT_ALIGN_LEFT
* TEXT_ALIGN_RIGHT
* TEXT_ALIGN_CENTER
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void initialize() {
* pros::lcd::initialize();
* pros::lcd::set_alignment(pros::lcd::Text_Align::LEFT);
* pros::lcd::print(0, "Left Aligned Text");
* pros::lcd::set_alignment(pros::lcd::Text_Align::CENTER);
* pros::lcd::print(1, "Center Aligned Text");
* pros::lcd::set_alignment(pros::lcd::Text_Align::RIGHT);
* pros::lcd::print(2, "Right Aligned Text");
* }
* \endcode
*/
void set_text_align(Text_Align alignment);
/**
* Gets the button status from the emulated three-button LCD.
*
* The value returned is a 3-bit integer where 1 0 0 indicates the left button
* is pressed, 0 1 0 indicates the center button is pressed, and 0 0 1
* indicates the right button is pressed. 0 is returned if no buttons are
* currently being pressed.
*
* Note that this function is provided for legacy API compatibility purposes,
* with the caveat that the V5 touch screen does not actually support pressing
* multiple points on the screen at the same time.
*
* \return The buttons pressed as a bit mask
*
* \b Example
* \code
* #include "pros/llemu.hpp"
*
* void initialize() {
* pros::lcd::initialize();
* }
*
* void opcontrol() {
* while(true) {
* std::uint8_t state = pros::lcd::read_buttons();
* pros::lcd::print(0, "%d %d %d",
* (state & LCD_BTN_LEFT) >> 2
* (state & LCD_BTN_CENTER) >> 1,
* (state & LCD_BTN_RIGHT) >> 0
* );
*
* pros::delay(10);
* }
* }
* \endcode
*/
std::uint8_t read_buttons(void);
///@}
} // namespace lcd
} // namespace pros
#endif // _LIBLVGL_LLEMU_HPP_