aboutsummaryrefslogtreecommitdiff
path: root/libraries/Robot_Control/lcd.cpp
diff options
context:
space:
mode:
authorCristian Maglie <c.maglie@bug.st>2013-05-29 18:30:36 +0200
committerCristian Maglie <c.maglie@bug.st>2013-05-29 18:30:36 +0200
commitd90fcca5839d13d57ed527d4009b78d22dafbde7 (patch)
tree768b98af21e5075846184dd3de41ae0c22e75e20 /libraries/Robot_Control/lcd.cpp
parent7207108255a772474b322151cb0fd113e8030afe (diff)
parentef4e8c65373f531ce6d37ff226a21fc9b358ff29 (diff)
Merged 1.0.5
Diffstat (limited to 'libraries/Robot_Control/lcd.cpp')
-rw-r--r--libraries/Robot_Control/lcd.cpp279
1 files changed, 279 insertions, 0 deletions
diff --git a/libraries/Robot_Control/lcd.cpp b/libraries/Robot_Control/lcd.cpp
new file mode 100644
index 0000000..1f9f2ce
--- /dev/null
+++ b/libraries/Robot_Control/lcd.cpp
@@ -0,0 +1,279 @@
+#include "ArduinoRobot.h"
+#include "Wire.h"
+
+#define BUFFPIXEL 20
+
+bool cmp(char* str1, char* str2, uint8_t len);
+uint16_t read16(Fat16& f);
+uint32_t read32(Fat16& f);
+//uint16_t color565(uint8_t r, uint8_t g, uint8_t b);
+
+void RobotControl::beginTFT(uint16_t foreGround, uint16_t backGround){
+ //TFT initialization
+ Arduino_LCD::initB();
+ Arduino_LCD::fillScreen(backGround);
+ Arduino_LCD::setTextColor(foreGround);
+ Arduino_LCD::setTextSize(1);
+ this->foreGround=foreGround;
+ this->backGround=backGround;
+}
+void RobotControl::_enableLCD(){
+ DDRB = DDRB & 0xEF; //pinMode(CS_SD,INPUT);
+ DDRB = DDRB | 0x20; //pinMode(CS_LCD,OUTPUT);
+}
+/*void RobotControl::_setErase(uint8_t posX, uint8_t posY){
+ Arduino_LCD::setCursor(posX,posY);
+ Arduino_LCD::setTextColor(backGround);
+ Arduino_LCD::setTextSize(1);
+}
+void RobotControl::_setWrite(uint8_t posX, uint8_t posY){
+ Arduino_LCD::setCursor(posX,posY);
+ Arduino_LCD::setTextColor(foreGround);
+ Arduino_LCD::setTextSize(1);
+}*/
+/*
+void RobotControl::text(int value, uint8_t posX, uint8_t posY, bool EW){
+ if(EW)
+ _setWrite(posX,posY);
+ else
+ _setErase(posX,posY);
+ Arduino_LCD::print(value);
+}
+void RobotControl::text(long value, uint8_t posX, uint8_t posY, bool EW){
+ if(EW)
+ _setWrite(posX,posY);
+ else
+ _setErase(posX,posY);
+ Arduino_LCD::print(value);
+}
+void RobotControl::text(char* value, uint8_t posX, uint8_t posY, bool EW){
+ if(EW)
+ _setWrite(posX,posY);
+ else
+ _setErase(posX,posY);
+ Arduino_LCD::print(value);
+}
+void RobotControl::text(char value, uint8_t posX, uint8_t posY, bool EW){
+ if(EW)
+ _setWrite(posX,posY);
+ else
+ _setErase(posX,posY);
+ Arduino_LCD::print(value);
+}
+*/
+
+void RobotControl::debugPrint(long value, uint8_t x, uint8_t y){
+ static long oldVal=0;
+ Arduino_LCD::stroke(backGround);
+ text(oldVal,x,y);
+ Arduino_LCD::stroke(foreGround);
+ text(value,x,y);
+ oldVal=value;
+}
+
+void RobotControl::clearScreen(){
+ Arduino_LCD::fillScreen(backGround);
+}
+
+void RobotControl::drawBMP(char* filename, uint8_t x, uint8_t y){
+ /*for(int j=0;j<NUM_EEPROM_BMP;j++){
+ Serial.println(_eeprom_bmp[j].name);
+ Serial.print(" ");
+ Serial.print(_eeprom_bmp[j].address);
+ Serial.print(" ");
+ Serial.print(_eeprom_bmp[j].width);
+ Serial.print(" ");
+ Serial.println(_eeprom_bmp[j].height);
+ }
+ Serial.println();*/
+ if(_isEEPROM_BMP_Allocated){
+ for(int i=0;i<NUM_EEPROM_BMP;i++){
+ if(cmp(_eeprom_bmp[i].name,filename,7)){
+ /*Serial.println(_eeprom_bmp[i].name);
+ Serial.print(" ");
+ Serial.print(_eeprom_bmp[i].address);
+ Serial.print(" ");
+ Serial.print(_eeprom_bmp[i].width);
+ Serial.print(" ");
+ Serial.println(_eeprom_bmp[i].height);*/
+ _drawBMP(_eeprom_bmp[i].address,x,y,_eeprom_bmp[i].width,_eeprom_bmp[i].height);
+ return;
+ }
+ }
+ }else{
+ _drawBMP(filename,x,y);//goes to SD
+ }
+}
+bool cmp(char* str1, char* str2, uint8_t len){
+ for(uint8_t i=0;i<len;i++){
+ if(str1[i]==' ')break;
+ if(str1[i]!=str2[i])return false;
+ }
+ return true;
+}
+
+void RobotControl::_drawBMP(uint32_t iconOffset, uint8_t x, uint8_t y, uint8_t width, uint8_t height){
+ uint8_t screenWidth=Arduino_LCD::width();
+ uint8_t screenHeight=Arduino_LCD::height();
+ if((x >= screenWidth) || (y >= screenHeight)) return;
+
+ // Crop area to be loaded
+ if((x+width-1) >= screenWidth) width = screenWidth - x;
+ if((y+height-1) >= screenHeight) height = screenHeight - y;
+
+ // Set TFT address window to clipped image bounds
+ Arduino_LCD::setAddrWindow(x, y, x+width-1, y+height-1);
+
+ // launch the reading command
+ _drawBMP_EEPROM(iconOffset, width, height);
+}
+
+// Draw BMP from SD card through the filename
+void RobotControl::_drawBMP(char* filename, uint8_t posX, uint8_t posY){
+ uint8_t bmpWidth, bmpHeight; // W+H in pixels
+ uint8_t bmpDepth; // Bit depth (currently must be 24)
+ uint32_t bmpImageoffset; // Start of image data in file
+ uint32_t rowSize; // Not always = bmpWidth; may have padding
+ uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
+ uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
+ bool goodBmp = false; // Set to true on valid header parse
+ bool flip = true; // BMP is stored bottom-to-top
+ uint8_t w, h, row, col;
+ uint8_t r, g, b;
+ uint32_t pos = 0;
+
+ // Open requested file on SD card
+ if ((file.open(filename,O_READ)) == NULL) {
+ return;
+ }
+
+ // Parse BMP header
+ if(read16(file) == 0x4D42) { // BMP signature
+ read32(file);//uint32_t aux = read32(file);
+ (void)read32(file); // Read & ignore creator bytes
+ bmpImageoffset = read32(file); // Start of image data
+
+ // Read DIB header
+ (void)read32(file);//aux = read32(file);
+ bmpWidth = read32(file);
+ bmpHeight = read32(file);
+
+ if(read16(file) == 1) { // # planes -- must be '1'
+ bmpDepth = read16(file); // bits per pixel
+ if((bmpDepth == 24) && (read32(file) == 0)) { // 0 = uncompressed
+ goodBmp = true; // Supported BMP format -- proceed!
+
+ // BMP rows are padded (if needed) to 4-byte boundary
+ rowSize = (bmpWidth * 3 + 3) & ~3;
+
+ // If bmpHeight is negative, image is in top-down order.
+ // This is not canon but has been observed in the wild.
+ if(bmpHeight < 0) {
+ bmpHeight = -bmpHeight;
+ flip = false;
+ }
+
+ // Crop area to be loaded
+ w = bmpWidth;
+ h = bmpHeight;
+
+ // Start drawing
+ //_enableLCD();
+ Arduino_LCD::setAddrWindow(posX, posY, posX+bmpWidth-1, posY+bmpHeight-1);
+
+ for (row=0; row<h; row++) { // For each scanline...
+ if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
+ pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
+ else // Bitmap is stored top-to-bottom
+ pos = bmpImageoffset + row * rowSize;
+
+ if(file.curPosition() != pos) { // Need seek?
+ //_enableSD();
+ file.seekSet(pos);
+ buffidx = sizeof(sdbuffer); // Force buffer reload
+ //_enableLCD();
+ }
+ for (col=0; col<w; col++) { // For each pixel...
+ // Time to read more pixel data?
+ if (buffidx >= sizeof(sdbuffer)) { // Indeed
+ //_enableSD();
+ file.read(sdbuffer, sizeof(sdbuffer));
+ buffidx = 0; // Set index to beginning
+ //_enableLCD();
+ }
+ // Convert pixel from BMP to TFT format, push to display
+ b = sdbuffer[buffidx++];
+ g = sdbuffer[buffidx++];
+ r = sdbuffer[buffidx++];
+
+ int color = Arduino_LCD::Color565(r,g,b);
+
+ Arduino_LCD::pushColor(color);
+ } // end pixel
+ } // end scanline
+ //_enableSD();
+ } // end goodBmp*/
+ }
+ }
+ file.close();
+ //_enableLCD();
+}
+uint16_t read16(Fat16& f) {
+ uint16_t result;
+ f.read(&result,sizeof(result));
+ return result;
+}
+uint32_t read32(Fat16& f) {
+ uint32_t result;
+ f.read(&result,sizeof(result));
+ return result;
+}
+/*
+uint16_t color565(uint8_t r, uint8_t g, uint8_t b) {
+ return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
+}*/
+
+
+void RobotControl::_drawBMP_EEPROM(uint16_t address, uint8_t width, uint8_t height){
+ uint16_t u16retVal = 0;
+ EEPROM_I2C::_beginTransmission(address);
+ EEPROM_I2C::_endTransmission();
+ /*Wire.beginTransmission(DEVICEADDRESS);
+ Wire.write( (address >> 8) & 0xFF );
+ Wire.write( (address >> 0) & 0xFF );
+ Wire.endTransmission();*/
+
+ long s = width * height ;
+ for(long j = 0; j < (long) s >> 4; j++) { // divided by 32, times 2
+ Wire.requestFrom(DEVICEADDRESS, 32);
+ for(int i = 0; i < 32; i+=2) {
+ u16retVal = Wire.read();
+ u16retVal = (u16retVal << 8) + Wire.read();
+ Arduino_LCD::pushColor(u16retVal);
+ }
+ }
+
+}
+void RobotControl::beginBMPFromEEPROM(){
+ _eeprom_bmp=(EEPROM_BMP*)malloc(NUM_EEPROM_BMP*sizeof(EEPROM_BMP));
+ EEPROM_I2C::_beginTransmission(0);
+ EEPROM_I2C::_endTransmission();
+
+ for(uint8_t j=0;j<NUM_EEPROM_BMP;j++){
+ Wire.requestFrom(DEVICEADDRESS, sizeof(EEPROM_BMP));
+ for(uint8_t i=0;i<8;i++){
+ _eeprom_bmp[j].name[i]=Wire.read();//name
+ }
+ _eeprom_bmp[j].width=Wire.read();//width
+ _eeprom_bmp[j].height=Wire.read();//height
+
+ _eeprom_bmp[j].address=Wire.read();
+ _eeprom_bmp[j].address=_eeprom_bmp[j].address + (Wire.read() << 8);//address
+ }
+ _isEEPROM_BMP_Allocated=true;
+
+}
+void RobotControl::endBMPFromEEPROM(){
+ free(_eeprom_bmp);
+ _isEEPROM_BMP_Allocated=false;
+}