172 lines
4.6 KiB
C
172 lines
4.6 KiB
C
/** @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_ */
|