Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of RA8875 by
Revision 86:e86b355940f4, committed 2015-01-17
- Comitter:
- WiredHome
- Date:
- Sat Jan 17 20:59:51 2015 +0000
- Parent:
- 85:022bba13c5c4
- Child:
- 87:ee2240581aa7
- Commit message:
- Added GetBacklight() and small refactoring of the memory allocation in PrintScreen().
Changed in this revision
| RA8875.cpp | Show annotated file Show diff for this revision Revisions of this file |
| RA8875.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/RA8875.cpp Tue Jan 13 12:31:44 2015 +0000
+++ b/RA8875.cpp Sat Jan 17 20:59:51 2015 +0000
@@ -1016,12 +1016,17 @@
RetCode_t RA8875::getPixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
{
color_t pixel;
+ RetCode_t ret = noerror;
+ INFO("getPixelStream(%p, %u, %d, %d)", p, count, x, y);
PERFORMANCE_RESET;
//WriteCommand(0x45,0x00); // read left->right, top->bottom
- WriteCommand(0x40,0x00); // Graphics write mode
- SetGraphicsCursorRead(x, y);
- WriteCommand(0x02);
+ ret = WriteCommand(0x40,0x00); // Graphics write mode
+ INFO(" r = %d", ret);
+ ret = SetGraphicsCursorRead(x, y);
+ INFO(" r = %d", ret);
+ ret = WriteCommand(0x02);
+ INFO(" r = %d", ret);
_select(true);
_spiwrite(0x40); // Cmd: read data
_spiwrite(0x00); // dummy read
@@ -1032,7 +1037,7 @@
}
_select(false);
REGISTERPERFORMANCE(PRF_READPIXELSTREAM);
- return noerror;
+ return ret;
}
@@ -1396,6 +1401,10 @@
return noerror;
}
+uint8_t RA8875::GetBacklight_u8(void)
+{
+ return ReadCommand(0x8b);
+}
RetCode_t RA8875::Backlight(float brightness)
{
@@ -1410,6 +1419,10 @@
return Backlight_u8(b);
}
+float RA8875::GetBacklight(void)
+{
+ return (float)(GetBacklight_u8())/255;
+}
RetCode_t RA8875::set_font(const unsigned char * _font)
{
@@ -1541,7 +1554,10 @@
{
BITMAPFILEHEADER BMP_Header;
BITMAPINFOHEADER BMP_Info;
-
+ uint8_t * lineBuffer = NULL;
+ color_t * pixelBuffer = NULL;
+ color_t * pixelBuffer2 = NULL;
+
INFO("(%d,%d) - (%d,%d) %s", x,y,w,h,Name_BMP);
if (x >= 0 && x < width()
&& y >= 0 && y < height()
@@ -1566,43 +1582,66 @@
BMP_Info.biClrUsed = 0;
BMP_Info.biClrImportant = 0;
- INFO("Writing {%s}", Name_BMP);
+ // Allocate the memory we need to proceed
+ int lineBufSize = ((24 * w + 7)/8);
+ lineBuffer = (uint8_t *)malloc(lineBufSize);
+ if (lineBuffer == NULL) {
+ ERR("Not enough RAM for PrintScreen lineBuffer");
+ return(not_enough_ram);
+ }
+
+ #define DOUBLEBUF /* one larger buffer instead of two */
+
+ #ifdef DOUBLEBUF
+ // In the "#else", pixelBuffer2 malloc returns a value,
+ // but is actually causing a failure later.
+ // This test helps determine if it is truly out of memory,
+ // or if malloc is broken.
+ pixelBuffer = (color_t *)malloc(2 * w * sizeof(color_t));
+ pixelBuffer2 = pixelBuffer + (w * sizeof(color_t));
+ #else
+ pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
+ pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
+ #endif
+ if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
+ ERR("Not enough RAM for pixelBuffer");
+ #ifndef DOUBLEBUF
+ if (pixelBuffer2)
+ free(pixelBuffer2);
+ #endif
+ if (pixelBuffer)
+ free(pixelBuffer);
+ free(lineBuffer);
+ if (pixelBuffer)
+ free(pixelBuffer);
+ return(not_enough_ram);
+ }
+
FILE *Image = fopen(Name_BMP, "wb");
if (!Image) {
- ERR("File not found");
+ ERR("Can't open file for write");
+ #ifndef DOUBLEBUF
+ if (pixelBuffer2)
+ free(pixelBuffer2);
+ #endif
+ if (pixelBuffer)
+ free(pixelBuffer);
+ free(lineBuffer);
+ if (pixelBuffer)
+ free(pixelBuffer);
return(file_not_found);
}
// Be optimistic - don't check for errors.
//HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
- fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
- //INFO("fwrite returned %d", r);
+ size_t r = fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
//HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
- fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
- //INFO("fwrite returned %d", r);
+ r = fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
- int lineBufSize = ((24 * w + 7)/8);
- uint8_t * lineBuffer = (uint8_t *)malloc(lineBufSize);
- if (lineBuffer == NULL) {
- fclose(Image);
- ERR("Not enough RAM for lineBuffer");
- return(not_enough_ram);
- }
- color_t * pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
- color_t * pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
color_t transparency = GetBackgroundTransparencyColor();
unsigned char ltpr0 = ReadCommand(0x52) & 0x7;
- if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
- fclose(Image);
- free(lineBuffer);
- ERR("Not enough RAM for pixelBuffer");
- if (pixelBuffer)
- free(pixelBuffer);
- return(not_enough_ram);
- }
-
uint16_t prevLayer = GetDrawingLayer();
// If only one of the layers is visible, select that layer
switch(ltpr0) {
@@ -1626,7 +1665,7 @@
ERR("getPixelStream error, and no recovery handler...");
}
if (ltpr0 >= 2) { // Need to combine the layers...
- SelectDrawingLayer(1); // so read layer 0 first
+ SelectDrawingLayer(1); // so read layer 1 next
if (getPixelStream(pixelBuffer2, w, x,y+j) != noerror) {
ERR("getPixelStream error, and no recovery handler...");
}
@@ -1666,9 +1705,15 @@
}
SelectDrawingLayer(prevLayer);
fclose(Image);
- free(pixelBuffer2); // don't leak memory.
- free(pixelBuffer);
+ #ifndef DOUBLEBUF
+ if (pixelBuffer2)
+ free(pixelBuffer2);
+ #endif
+ if (pixelBuffer)
+ free(pixelBuffer);
free(lineBuffer);
+ if (pixelBuffer)
+ free(pixelBuffer);
INFO("Image closed");
return noerror;
} else {
--- a/RA8875.h Tue Jan 13 12:31:44 2015 +0000
+++ b/RA8875.h Sat Jan 17 20:59:51 2015 +0000
@@ -1650,6 +1650,12 @@
///
RetCode_t Backlight_u8(unsigned char brightness);
+ /// Get backlight brightness.
+ ///
+ /// @returns backlight setting from 0 (off) to 255 (full on).
+ ///
+ uint8_t GetBacklight_u8(void);
+
/// Set backlight brightness.
///
/// When the built-in PWM is used to control the backlight, this
@@ -1660,6 +1666,12 @@
///
RetCode_t Backlight(float brightness);
+ /// Get backlight brightness.
+ ///
+ /// @returns backlight setting from 0 (off) to 1.0 (full on).
+ ///
+ float GetBacklight(void);
+
/// Select a bitmap font (provided by the user) for all subsequent text.
///
/// @note Tool to create the fonts is accessible from its creator
