You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.6 KiB
171 lines
4.6 KiB
/** @file |
|
* @brief BBC micro:bit display APIs. |
|
*/ |
|
|
|
/* |
|
* Copyright (c) 2017 Intel Corporation |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#ifndef ZEPHYR_INCLUDE_DISPLAY_MB_DISPLAY_H_ |
|
#define ZEPHYR_INCLUDE_DISPLAY_MB_DISPLAY_H_ |
|
|
|
/** |
|
* @brief BBC micro:bit display APIs |
|
* @defgroup mb_display BBC micro:bit display APIs |
|
* @ingroup display_interfaces |
|
* @{ |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <zephyr/types.h> |
|
#include <stdbool.h> |
|
#include <sys/util.h> |
|
#include <toolchain.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/** |
|
* @brief Representation of a BBC micro:bit display image. |
|
* |
|
* This struct should normally not be used directly, rather created |
|
* using the MB_IMAGE() macro. |
|
*/ |
|
struct mb_image { |
|
union { |
|
struct { |
|
uint8_t c1:1, |
|
c2:1, |
|
c3:1, |
|
c4:1, |
|
c5:1; |
|
} r[5]; |
|
uint8_t row[5]; |
|
}; |
|
}; |
|
|
|
/** |
|
* @brief Display mode. |
|
* |
|
* First 16 bits are reserved for modes, last 16 for flags. |
|
*/ |
|
enum mb_display_mode { |
|
/** Default mode ("single" for images, "scroll" for text). */ |
|
MB_DISPLAY_MODE_DEFAULT, |
|
|
|
/** Display images sequentially, one at a time. */ |
|
MB_DISPLAY_MODE_SINGLE, |
|
|
|
/** Display images by scrolling. */ |
|
MB_DISPLAY_MODE_SCROLL, |
|
|
|
/* Display flags, i.e. modifiers to the chosen mode */ |
|
|
|
/** Loop back to the beginning when reaching the last image. */ |
|
MB_DISPLAY_FLAG_LOOP = BIT(16), |
|
}; |
|
|
|
/** |
|
* @def MB_IMAGE |
|
* @brief Generate an image object from a given array rows/columns. |
|
* |
|
* This helper takes an array of 5 rows, each consisting of 5 0/1 values which |
|
* correspond to the columns of that row. The value 0 means the pixel is |
|
* disabled whereas a 1 means the pixel is enabled. |
|
* |
|
* The pixels go from left to right and top to bottom, i.e. top-left corner |
|
* is the first row's first value, top-right is the first rows last value, |
|
* and bottom-right corner is the last value of the last (5th) row. As an |
|
* example, the following would create a smiley face image: |
|
* |
|
* <pre> |
|
* static const struct mb_image smiley = MB_IMAGE({ 0, 1, 0, 1, 0 }, |
|
* { 0, 1, 0, 1, 0 }, |
|
* { 0, 0, 0, 0, 0 }, |
|
* { 1, 0, 0, 0, 1 }, |
|
* { 0, 1, 1, 1, 0 }); |
|
* </pre> |
|
* |
|
* @param _rows Each of the 5 rows represented as a 5-value column array. |
|
* |
|
* @return Image bitmap that can be passed e.g. to mb_display_image(). |
|
*/ |
|
#define MB_IMAGE(_rows...) { .r = { _rows } } |
|
|
|
/** |
|
* @brief Opaque struct representing the BBC micro:bit display. |
|
* |
|
* For more information see the following links: |
|
* |
|
* https://www.microbit.co.uk/device/screen |
|
* |
|
* https://lancaster-university.github.io/microbit-docs/ubit/display/ |
|
*/ |
|
struct mb_display; |
|
|
|
/** |
|
* @brief Get a pointer to the BBC micro:bit display object. |
|
* |
|
* @return Pointer to display object. |
|
*/ |
|
struct mb_display *mb_display_get(void); |
|
|
|
/** |
|
* @brief Display one or more images on the BBC micro:bit LED display. |
|
* |
|
* This function takes an array of one or more images and renders them |
|
* sequentially on the micro:bit display. The call is asynchronous, i.e. |
|
* the processing of the display happens in the background. If there is |
|
* another image being displayed it will be canceled and the new one takes |
|
* over. |
|
* |
|
* @param disp Display object. |
|
* @param mode One of the MB_DISPLAY_MODE_* options. |
|
* @param duration Duration how long to show each image (in milliseconds), or |
|
* @ref SYS_FOREVER_MS. |
|
* @param img Array of image bitmaps (struct mb_image objects). |
|
* @param img_count Number of images in 'img' array. |
|
*/ |
|
void mb_display_image(struct mb_display *disp, uint32_t mode, int32_t duration, |
|
const struct mb_image *img, uint8_t img_count); |
|
|
|
/** |
|
* @brief Print a string of characters on the BBC micro:bit LED display. |
|
* |
|
* This function takes a printf-style format string and outputs it in a |
|
* scrolling fashion to the display. |
|
* |
|
* The call is asynchronous, i.e. the processing of the display happens in |
|
* the background. If there is another image or string being displayed it |
|
* will be canceled and the new one takes over. |
|
* |
|
* @param disp Display object. |
|
* @param mode One of the MB_DISPLAY_MODE_* options. |
|
* @param duration Duration how long to show each character (in milliseconds), |
|
* or @ref SYS_FOREVER_MS. |
|
* @param fmt printf-style format string |
|
* @param ... Optional list of format arguments. |
|
*/ |
|
__printf_like(4, 5) void mb_display_print(struct mb_display *disp, |
|
uint32_t mode, int32_t duration, |
|
const char *fmt, ...); |
|
|
|
/** |
|
* @brief Stop the ongoing display of an image. |
|
* |
|
* @param disp Display object. |
|
*/ |
|
void mb_display_stop(struct mb_display *disp); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
/** |
|
* @} |
|
*/ |
|
|
|
#endif /* ZEPHYR_INCLUDE_DISPLAY_MB_DISPLAY_H_ */
|
|
|