diff options
author | Cristian Maglie <c.maglie@bug.st> | 2013-06-01 23:16:02 +0200 |
---|---|---|
committer | Cristian Maglie <c.maglie@bug.st> | 2013-06-01 23:16:02 +0200 |
commit | 177ad96f866714a4962be57f69cd3d5a6334cde1 (patch) | |
tree | 1072239986340d6a239adac924eddf2e1d1ca566 /libraries/Robot_Control/lcd.cpp | |
parent | 6cff36ac5e85c74bcb45cc53491ad69d64520b36 (diff) | |
parent | d90fcca5839d13d57ed527d4009b78d22dafbde7 (diff) |
Merge branch 'merge-1.0.5' into ide-1.5.x-discovery
Diffstat (limited to 'libraries/Robot_Control/lcd.cpp')
-rw-r--r-- | libraries/Robot_Control/lcd.cpp | 279 |
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; +} |