#include "Display.h" // Constructor implementation EPaper Display::_epaper; Display::Display() {} void Display::init(){ _epaper.begin(); _epaper.fillScreen(TFT_WHITE); _epaper.setTextColor(TFT_BLACK, TFT_WHITE); // Adding a background colour erases previous text automatically _drawScreenLayout(); refreshDisplay(); } void Display::refreshDisplay(){ _epaper.update(); //_epaper.sleep(); } void Display::_drawScreenLayout(){ _drawFPS(); _drawFPE(); showChronographDisconnected(); _drawShotCount(); _drawAverageFPS(); _drawLowFPS(); _drawHighFPS(); _drawSpread(); _drawStandardDeviation(); _drawProfile(); _drawLastShots(); } void Display::_drawFPE(){ _epaper.setTextSize(2); _epaper.drawString("FPE: ",20,240); } void Display::updateFPE(int fpe){ _epaper.fillRect(65,230,100,35,TFT_WHITE); char buffer[10]; itoa(fpe, buffer, 10); _epaper.setTextSize(2); _epaper.drawString(buffer,70,240); } void Display::_drawFPS(){ _epaper.drawRoundRect(10, 10, 300, 260, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Latest Shot:", 15, 15); } void Display::updateFPS(int fps){ if (fps>0){ _epaper.fillRoundRect(20, 70, 280, 110, 15, TFT_WHITE); _epaper.setTextSize(20); char floatCharArray[10]; dtostrf(fps, 3, 0, floatCharArray); _epaper.drawString(floatCharArray, 100, 100); _epaper.setTextSize(2); _epaper.drawString("fps", 145, 155); } else{ _epaper.fillRoundRect(20, 70, 280, 110, 15, TFT_WHITE); _epaper.setTextSize(20); _epaper.drawString(" -", 100, 100); _epaper.setTextSize(2); _epaper.drawString("fps", 145, 155); } } void Display::_drawAverageFPS(){ _epaper.drawRoundRect(450, 10, 120, 80, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Avg FPS:",465,15); _epaper.setTextSize(4); _epaper.drawString("-",475,45); } void Display::updateAverageFPS(int fps){ _epaper.fillRoundRect(460, 35, 100, 45, 10, TFT_WHITE); _epaper.setTextSize(4); if (fps>0){ char buffer[10]; itoa(fps, buffer, 10); _epaper.drawString(buffer,475,45); } else{ _epaper.drawString("-",475,45); } } void Display::_drawLowFPS(){ _epaper.drawRoundRect(450, 100, 120, 80, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Low FPS:",465,105); _epaper.setTextSize(4); _epaper.drawString("-",475,135); } void Display::updateLowFPS(int fps){ _epaper.fillRoundRect(460, 125, 100, 45, 10, TFT_WHITE); _epaper.setTextSize(4); if (fps>0){ char buffer[10]; itoa(fps, buffer, 10); _epaper.drawString(buffer,475,135); } else{ _epaper.drawString("-",475,135); } } void Display::_drawHighFPS(){ _epaper.drawRoundRect(450, 190, 120, 80, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("High FPS:",460,195); _epaper.setTextSize(4); _epaper.drawString("-",475,225); } void Display::updateHighFPS(int fps){ _epaper.fillRoundRect(460, 215, 100, 45, 10, TFT_WHITE); _epaper.setTextSize(2); _epaper.drawString("High FPS:",460,195); _epaper.setTextSize(4); if (fps>0){ char buffer[10]; itoa(fps, buffer, 10); _epaper.drawString(buffer,475,225); } else{ _epaper.drawString("-",475,225); } } void Display::_drawProfile(){ _epaper.drawRoundRect(580, 40, 210, 230, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Profile:", 585, 45); } void Display::updateProfile(ChronoProfile& profile){ String gunName=profile.getGunProfile().getName(); int powerLevel=profile.getGunProfile().getPowerLevel() + 1; _epaper.fillRect(590, 70, 280, 120, TFT_WHITE); _epaper.drawRoundRect(580, 40, 210, 230, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString(gunName, 595, 75); _epaper.drawCircle(770, 56, 12, TFT_BLACK); char buffer[10]; itoa(powerLevel, buffer, 10); _epaper.drawString(buffer, 766, 49); String projectileName=profile.getProjectileProfile().getName(); String projectileType=profile.getProjectileProfile().getType(); float projectileWeight=profile.getProjectileProfile().getWeight(); float projectileCaliber=profile.getProjectileProfile().getCaliber(); _epaper.drawString(projectileName, 595, 105); char buffer3[10]; dtostrf(projectileCaliber, 0, 2, buffer3); char buffer4[10]; strncpy(buffer4, buffer3 + 1, 4); _epaper.drawString(buffer4, 595, 130); _epaper.drawString(projectileType, 595, 155); char buffer2[10]; dtostrf(projectileWeight, 1, 2, buffer2); char out[20]; strcpy(out,buffer2); strcat(out,"g"); _epaper.drawString(out, 595, 180); } void Display::_drawShotCount(){ _epaper.drawRoundRect(320, 10, 120, 80, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Count:",325,15); _epaper.setTextSize(4); _epaper.drawString("-",335,45); } void Display::updateShotCount(int count){ _epaper.fillRoundRect(330, 35, 100, 45, 10, TFT_WHITE); char buffer[10]; itoa(count, buffer, 10); _epaper.setTextSize(4); _epaper.drawString(buffer,335,45); } void Display::_drawSpread(){ _epaper.drawRoundRect(320, 100, 120, 80, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Spread:",325,105); _epaper.setTextSize(4); _epaper.drawString("-",335,135); } void Display::updateSpread(int spread){ _epaper.fillRoundRect(330, 125, 100, 45, 10, TFT_WHITE); _epaper.setTextSize(2); _epaper.drawString("Spread:",325,105); _epaper.setTextSize(4); if (spread>=0){ char buffer[10]; itoa(spread, buffer, 10); _epaper.drawString(buffer,335,135); } else{ _epaper.drawString("-",335,135); } } void Display::_drawStandardDeviation(){ _epaper.drawRoundRect(320, 190, 120, 80, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("SD:",325,195); _epaper.setTextSize(4); _epaper.drawString("-",335,225); } void Display::updateStandardDeviation(float sd){ _epaper.fillRoundRect(330, 215, 100, 45, 10, TFT_WHITE); if (sd==0){ _epaper.setTextSize(4); _epaper.drawString("-",335,225); } else{ _epaper.setTextSize(3); char buffer[10]; dtostrf(sd, 1, 2, buffer); _epaper.drawString(buffer,335,225); } } void Display::_drawLastShots(){ _epaper.drawRoundRect(10, 280, 780, 190, 10, TFT_BLACK); _epaper.setTextSize(2); _epaper.drawString("Last Shots:",15,285); } void Display::updateLastShots(LinkedList &chronoReadings){ _epaper.fillRoundRect(20, 305, 760, 155, 10, TFT_WHITE); const int max=32; _epaper.setTextSize(2); int chronographReadingCount=chronoReadings.size(); if (chronographReadingCount>0){ int x=25; int y=310; for (int i=0;i=max){break;} int c=chronographReadingCount-i; int fps=chronoReadings.get(chronographReadingCount-i-1).getFPS(); int fpe=chronoReadings.get(chronographReadingCount-i-1).getFPE(); char charArray[50]; sprintf(charArray, "%d) %d / %d", c, fps, fpe); if (i%8 == 0 && i>0){x=x+190; y=310;} _epaper.drawString(charArray, x, y); y=y+20; } } } void Display::showChronographConnected(){ _epaper.fillRoundRect(20, 70, 280, 110, 15, TFT_WHITE); //_epaper.update(); _epaper.setTextSize(20); _epaper.drawString(" -", 100, 100); _epaper.setTextSize(2); _epaper.drawString("fps", 145, 155); } void Display::showChronographDisconnected(){ _epaper.setTextSize(3); _epaper.fillRoundRect(20, 70, 280, 110, 15, TFT_BLACK); //_epaper.update(); _epaper.setTextColor(TFT_WHITE, TFT_BLACK); _epaper.drawString("Searching", 80, 80); _epaper.drawString("for", 135, 110); _epaper.drawString("chronograph...", 35, 140); _epaper.setTextColor(TFT_BLACK, TFT_WHITE); } void Display::updateTime(String time){ _epaper.drawRect(698, 8, 102, 35, TFT_WHITE); //reset to get rid of ghosting _epaper.update(); _epaper.setTextSize(3); _epaper.drawString(time,700,10); } void Display::updateEntireDisplay(){ ChronoReadingManager& chronoReadings = ChronoReadingManager::getInstance(); //update display updateFPS(chronoReadings.getLastFPS()); updateFPE(chronoReadings.getLastFPE()); updateShotCount(chronoReadings.getShotCount()); updateAverageFPS(chronoReadings.getAvgFPS()); updateLowFPS(chronoReadings.getLowFPS()); updateHighFPS(chronoReadings.getHighFPS()); updateSpread(chronoReadings.getSpread()); updateStandardDeviation(chronoReadings.getStandardDeviation()); LinkedList &readings=chronoReadings.getChronographReadings(); updateLastShots(readings); }