1
0
mirror of https://github.com/taigrr/arduinolibs synced 2025-01-18 04:33:12 -08:00

Update usage of PROGMEM to Arduino 1.0.1

This commit is contained in:
Rhys Weatherley 2013-09-29 09:15:24 +10:00
parent 6a5ec04068
commit 393eb6c2ba
14 changed files with 50 additions and 41 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
backup backup
*.swp *.swp
hardware

View File

@ -79,7 +79,7 @@ int main(int argc, char *argv[])
// Dump the button mapping table for the selected bit count. // Dump the button mapping table for the selected bit count.
bits = 5; bits = 5;
printf("static prog_uint8_t const buttonMappings[] PROGMEM = {\n"); printf("static uint8_t const buttonMappings[] PROGMEM = {\n");
for (value2 = 0; value2 < (1 << bits); ++value2) { for (value2 = 0; value2 < (1 << bits); ++value2) {
value = value2 << (10 - bits); value = value2 << (10 - bits);
value3 = value + (1 << (10 - bits)) - 1; value3 = value + (1 << (10 - bits)) - 1;

View File

@ -47,6 +47,16 @@
* \sa Black, White * \sa Black, White
*/ */
/**
* \typedef Bitmap::ProgMem
* \brief Type that represents a bitmap within program memory.
*/
/**
* \typedef Bitmap::Font
* \brief Type that represents a font within program memory.
*/
/** /**
* \var Bitmap::Black * \var Bitmap::Black
* \brief Color value corresponding to "black". * \brief Color value corresponding to "black".
@ -412,14 +422,14 @@ void Bitmap::drawBitmap(int x, int y, const Bitmap &bitmap, Color color)
* *
* \sa drawInvertedBitmap(), fill() * \sa drawInvertedBitmap(), fill()
*/ */
void Bitmap::drawBitmap(int x, int y, const prog_uint8_t *bitmap, Color color) void Bitmap::drawBitmap(int x, int y, Bitmap::ProgMem bitmap, Color color)
{ {
uint8_t w = pgm_read_byte(bitmap); uint8_t w = pgm_read_byte(bitmap);
uint8_t s = (w + 7) >> 3; uint8_t s = (w + 7) >> 3;
uint8_t h = pgm_read_byte(bitmap + 1); uint8_t h = pgm_read_byte(bitmap + 1);
Color invColor = !color; Color invColor = !color;
for (uint8_t by = 0; by < h; ++by) { for (uint8_t by = 0; by < h; ++by) {
const prog_uint8_t *line = bitmap + 2 + by * s; const uint8_t *line = ((const uint8_t *)bitmap) + 2 + by * s;
uint8_t mask = 0x80; uint8_t mask = 0x80;
uint8_t value = pgm_read_byte(line); uint8_t value = pgm_read_byte(line);
for (uint8_t bx = 0; bx < w; ++bx) { for (uint8_t bx = 0; bx < w; ++bx) {
@ -448,7 +458,7 @@ void Bitmap::drawBitmap(int x, int y, const prog_uint8_t *bitmap, Color color)
*/ */
/** /**
* \fn void Bitmap::drawInvertedBitmap(int x, int y, const prog_uint8_t *bitmap) * \fn void Bitmap::drawInvertedBitmap(int x, int y, Bitmap::ProgMem bitmap)
* \brief Draws \a bitmap at (\a x, \a y) in inverted colors. * \brief Draws \a bitmap at (\a x, \a y) in inverted colors.
* *
* This is a convenience function that is equivalent to * This is a convenience function that is equivalent to
@ -458,14 +468,14 @@ void Bitmap::drawBitmap(int x, int y, const prog_uint8_t *bitmap, Color color)
*/ */
/** /**
* \fn const prog_uint8_t *Bitmap::font() const * \fn Font Bitmap::font() const
* \brief Returns the currently selected font, or null if none selected. * \brief Returns the currently selected font, or null if none selected.
* *
* \sa setFont(), drawText(), drawChar(), charWidth() * \sa setFont(), drawText(), drawChar(), charWidth()
*/ */
/** /**
* \fn void Bitmap::setFont(const prog_uint8_t *font) * \fn void Bitmap::setFont(Font font)
* \brief Sets the \a font for use with drawText() and drawChar(). * \brief Sets the \a font for use with drawText() and drawChar().
* *
* \code * \code
@ -590,15 +600,15 @@ int Bitmap::drawChar(int x, int y, char ch)
index -= first; index -= first;
uint8_t heightBytes = (height + 7) >> 3;; uint8_t heightBytes = (height + 7) >> 3;;
uint8_t width; uint8_t width;
const prog_uint8_t *image; const uint8_t *image;
if (fontIsFixed(_font)) { if (fontIsFixed(_font)) {
// Fixed-width font. // Fixed-width font.
width = fontWidth(_font); width = fontWidth(_font);
image = _font + 6 + index * heightBytes * width; image = ((const uint8_t *)_font) + 6 + index * heightBytes * width;
} else { } else {
// Variable-width font. // Variable-width font.
width = pgm_read_byte(_font + 6 + index); width = pgm_read_byte(_font + 6 + index);
image = _font + 6 + count; image = ((const uint8_t *)_font) + 6 + count;
for (uint8_t temp = 0; temp < index; ++temp) { for (uint8_t temp = 0; temp < index; ++temp) {
// Scan through all previous characters to find the starting // Scan through all previous characters to find the starting
// location for this one. // location for this one.
@ -772,7 +782,7 @@ void Bitmap::fill(int x, int y, int width, int height, Color color)
* *
* \sa drawBitmap(), clear(), invert() * \sa drawBitmap(), clear(), invert()
*/ */
void Bitmap::fill(int x, int y, int width, int height, const prog_uint8_t *pattern, Color color) void Bitmap::fill(int x, int y, int width, int height, Bitmap::ProgMem pattern, Color color)
{ {
uint8_t w = pgm_read_byte(pattern); uint8_t w = pgm_read_byte(pattern);
uint8_t s = (w + 7) >> 3; uint8_t s = (w + 7) >> 3;
@ -781,8 +791,8 @@ void Bitmap::fill(int x, int y, int width, int height, const prog_uint8_t *patte
return; return;
Color invColor = !color; Color invColor = !color;
for (int tempy = 0; tempy < height; ++tempy) { for (int tempy = 0; tempy < height; ++tempy) {
const prog_uint8_t *startLine = pattern + 2 + (tempy % h) * s; const uint8_t *startLine = ((const uint8_t *)pattern) + 2 + (tempy % h) * s;
const prog_uint8_t *line = startLine; const uint8_t *line = startLine;
uint8_t mask = 0x80; uint8_t mask = 0x80;
uint8_t value = pgm_read_byte(line++); uint8_t value = pgm_read_byte(line++);
int bit = 0; int bit = 0;

View File

@ -38,6 +38,8 @@ public:
bool isValid() const { return fb != 0; } bool isValid() const { return fb != 0; }
typedef uint8_t Color; typedef uint8_t Color;
typedef PGM_VOID_P ProgMem;
typedef PGM_VOID_P Font;
static const Color Black = 0; static const Color Black = 0;
static const Color White = 1; static const Color White = 1;
@ -63,12 +65,12 @@ public:
void drawFilledCircle(int centerX, int centerY, int radius, Color color = White); void drawFilledCircle(int centerX, int centerY, int radius, Color color = White);
void drawBitmap(int x, int y, const Bitmap &bitmap, Color color = White); void drawBitmap(int x, int y, const Bitmap &bitmap, Color color = White);
void drawBitmap(int x, int y, const prog_uint8_t *bitmap, Color color = White); void drawBitmap(int x, int y, Bitmap::ProgMem bitmap, Color color = White);
void drawInvertedBitmap(int x, int y, const Bitmap &bitmap); void drawInvertedBitmap(int x, int y, const Bitmap &bitmap);
void drawInvertedBitmap(int x, int y, const prog_uint8_t *bitmap); void drawInvertedBitmap(int x, int y, Bitmap::ProgMem bitmap);
const prog_uint8_t *font() const { return _font; } Font font() const { return _font; }
void setFont(const prog_uint8_t *font) { _font = font; } void setFont(Font font) { _font = font; }
Color textColor() const { return _textColor; } Color textColor() const { return _textColor; }
void setTextColor(Color color) { _textColor = color; } void setTextColor(Color color) { _textColor = color; }
@ -85,7 +87,7 @@ public:
void copy(int x, int y, int width, int height, Bitmap *dest, int destX, int destY); void copy(int x, int y, int width, int height, Bitmap *dest, int destX, int destY);
void fill(int x, int y, int width, int height, Color color); void fill(int x, int y, int width, int height, Color color);
void fill(int x, int y, int width, int height, const prog_uint8_t *pattern, Color color = White); void fill(int x, int y, int width, int height, Bitmap::ProgMem pattern, Color color = White);
void scroll(int dx, int dy, Color fillColor = Black); void scroll(int dx, int dy, Color fillColor = Black);
void scroll(int x, int y, int width, int height, int dx, int dy, Color fillColor = Black); void scroll(int x, int y, int width, int height, int dx, int dy, Color fillColor = Black);
@ -101,7 +103,7 @@ private:
int _height; int _height;
int _stride; int _stride;
uint8_t *fb; uint8_t *fb;
const prog_uint8_t *_font; Font _font;
Color _textColor; Color _textColor;
friend class DMD; friend class DMD;
@ -125,7 +127,7 @@ inline void Bitmap::drawInvertedBitmap(int x, int y, const Bitmap &bitmap)
drawBitmap(x, y, bitmap, Black); drawBitmap(x, y, bitmap, Black);
} }
inline void Bitmap::drawInvertedBitmap(int x, int y, const prog_uint8_t *bitmap) inline void Bitmap::drawInvertedBitmap(int x, int y, Bitmap::ProgMem bitmap)
{ {
drawBitmap(x, y, bitmap, Black); drawBitmap(x, y, bitmap, Black);
} }

View File

@ -45,7 +45,7 @@
#define DEJAVUSANS9_WIDTH 10 #define DEJAVUSANS9_WIDTH 10
#define DEJAVUSANS9_HEIGHT 10 #define DEJAVUSANS9_HEIGHT 10
static uint8_t DejaVuSans9[] PROGMEM = { static uint8_t const DejaVuSans9[] PROGMEM = {
0x0F, 0x7A, // size 0x0F, 0x7A, // size
0x0A, // width 0x0A, // width
0x0A, // height 0x0A, // height

View File

@ -45,7 +45,7 @@
#define DEJAVUSANSBOLD9_WIDTH 10 #define DEJAVUSANSBOLD9_WIDTH 10
#define DEJAVUSANSBOLD9_HEIGHT 10 #define DEJAVUSANSBOLD9_HEIGHT 10
static uint8_t DejaVuSansBold9[] PROGMEM = { static uint8_t const DejaVuSansBold9[] PROGMEM = {
0x12, 0x36, // size 0x12, 0x36, // size
0x0A, // width 0x0A, // width
0x0A, // height 0x0A, // height

View File

@ -45,7 +45,7 @@
#define DEJAVUSANSITALIC9_WIDTH 10 #define DEJAVUSANSITALIC9_WIDTH 10
#define DEJAVUSANSITALIC9_HEIGHT 10 #define DEJAVUSANSITALIC9_HEIGHT 10
static uint8_t DejaVuSansItalic9[] PROGMEM = { static uint8_t const DejaVuSansItalic9[] PROGMEM = {
0x11, 0xDC, // size 0x11, 0xDC, // size
0x0A, // width 0x0A, // width
0x0A, // height 0x0A, // height

View File

@ -45,7 +45,7 @@
#define MONO5X7_WIDTH 5 #define MONO5X7_WIDTH 5
#define MONO5X7_HEIGHT 7 #define MONO5X7_HEIGHT 7
static uint8_t Mono5x7[] PROGMEM = { static uint8_t const Mono5x7[] PROGMEM = {
0x00, 0x00, // size 0x00, 0x00, // size
0x05, // width 0x05, // width
0x07, // height 0x07, // height

View File

@ -227,7 +227,7 @@ byte const run10[] PROGMEM = {
B01000000, B00000000 B01000000, B00000000
}; };
const prog_uint8_t *frames[] = { Bitmap::ProgMem frames[] = {
run1, run1,
run2, run2,
run3, run3,

View File

@ -227,7 +227,7 @@ byte const run10[] PROGMEM = {
B01000000, B00000000 B01000000, B00000000
}; };
const prog_uint8_t *frames[] = { Bitmap::ProgMem frames[] = {
run1, run1,
run2, run2,
run3, run3,

View File

@ -319,7 +319,7 @@ void LCD::disableScreenSaver()
*/ */
// Button mapping table generated by genlookup.c // Button mapping table generated by genlookup.c
static prog_uint8_t const buttonMappings[] PROGMEM = { static unsigned char const buttonMappings[] PROGMEM = {
2, 0, 0, 0, 3, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 1, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0 1, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0
}; };

View File

@ -26,7 +26,7 @@
#include "Field.h" #include "Field.h"
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
typedef const prog_char *ListItem; typedef PGM_P ListItem;
typedef const PROGMEM ListItem *ListItems; typedef const PROGMEM ListItem *ListItems;
class ListField : public Field { class ListField : public Field {

View File

@ -49,7 +49,7 @@ static const char item_FourBeeps[] PROGMEM = "Four beeps";
static const char item_Haircut[] PROGMEM = "Shave 'n haircut"; static const char item_Haircut[] PROGMEM = "Shave 'n haircut";
static const char item_SOS[] PROGMEM = "S.O.S."; static const char item_SOS[] PROGMEM = "S.O.S.";
static const char item_Radio[] PROGMEM = "Radio"; static const char item_Radio[] PROGMEM = "Radio";
static ListItem melodyNames[] PROGMEM = { static ListItem const melodyNames[] PROGMEM = {
item_FourBeeps, item_FourBeeps,
item_Haircut, item_Haircut,
item_SOS, item_SOS,

View File

@ -104,7 +104,7 @@ void printDec2(int value)
Serial.print((char)('0' + (value % 10))); Serial.print((char)('0' + (value % 10)));
} }
void printProgString(const prog_char *str) void printProgString(PGM_P str)
{ {
for (;;) { for (;;) {
char ch = (char)(pgm_read_byte(str)); char ch = (char)(pgm_read_byte(str));
@ -309,10 +309,10 @@ void cmdNvram(const char *args)
typedef void (*commandFunc)(const char *args); typedef void (*commandFunc)(const char *args);
typedef struct typedef struct
{ {
const prog_char *name; PGM_P name;
commandFunc func; commandFunc func;
const prog_char *desc; PGM_P desc;
const prog_char *args; PGM_P args;
} command_t; } command_t;
const char s_cmdTime[] PROGMEM = "TIME"; const char s_cmdTime[] PROGMEM = "TIME";
const char s_cmdTimeDesc[] PROGMEM = const char s_cmdTimeDesc[] PROGMEM =
@ -354,14 +354,11 @@ void cmdHelp(const char *)
{ {
int index = 0; int index = 0;
for (;;) { for (;;) {
const prog_char *name = (const prog_char *) PGM_P name = (PGM_P)(pgm_read_word(&(commands[index].name)));
(pgm_read_word(&(commands[index].name)));
if (!name) if (!name)
break; break;
const prog_char *desc = (const prog_char *) PGM_P desc = (PGM_P)(pgm_read_word(&(commands[index].desc)));
(pgm_read_word(&(commands[index].desc))); PGM_P args = (PGM_P)(pgm_read_word(&(commands[index].args)));
const prog_char *args = (const prog_char *)
(pgm_read_word(&(commands[index].args)));
printProgString(name); printProgString(name);
if (args) { if (args) {
Serial.print(' '); Serial.print(' ');
@ -376,7 +373,7 @@ void cmdHelp(const char *)
} }
// Match a data-space string where the name comes from PROGMEM. // Match a data-space string where the name comes from PROGMEM.
bool matchString(const prog_char *name, const char *str, int len) bool matchString(PGM_P name, const char *str, int len)
{ {
for (;;) { for (;;) {
char ch1 = (char)(pgm_read_byte(name)); char ch1 = (char)(pgm_read_byte(name));
@ -425,8 +422,7 @@ void processCommand(const char *buf)
// Find the command and execute it. // Find the command and execute it.
int index = 0; int index = 0;
for (;;) { for (;;) {
const prog_char *name = (const prog_char *) PGM_P name = (PGM_P)(pgm_read_word(&(commands[index].name)));
(pgm_read_word(&(commands[index].name)));
if (!name) if (!name)
break; break;
if (matchString(name, cmd, len)) { if (matchString(name, cmd, len)) {