mirror of https://github.com/lumapu/ahoy.git
				
				
			
				 4 changed files with 294 additions and 6 deletions
			
			
		| @ -0,0 +1,237 @@ | |||||
|  | #ifndef __MONOCHROME_DISPLAY__ | ||||
|  | #define __MONOCHROME_DISPLAY__ | ||||
|  | 
 | ||||
|  | #ifdef ENA_NOKIA | ||||
|  |     #include <U8g2lib.h> | ||||
|  |     #define DISP_PROGMEM U8X8_PROGMEM | ||||
|  | #else // ENA_SSD1306
 | ||||
|  |     /* esp8266 : SCL = 5, SDA = 4 */ | ||||
|  |     /* ewsp32  : SCL = 22, SDA = 21 */ | ||||
|  |     #include <Wire.h> | ||||
|  |     #include <SSD1306Wire.h> | ||||
|  |     #define DISP_PROGMEM PROGMEM | ||||
|  | #endif | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | #include "../../utils/helper.h" | ||||
|  | #include "../../hm/hmSystem.h" | ||||
|  | 
 | ||||
|  | static uint8_t bmp_arrow[] DISP_PROGMEM = { | ||||
|  |     B00000000, B00011100, B00011100, B00001110, B00001110, B11111110, B01111111, | ||||
|  |     B01110000, B01110000, B00110000, B00111000, B00011000, B01111111, B00111111, | ||||
|  |     B00011110, B00001110, B00000110, B00000000, B00000000, B00000000, B00000000} ; | ||||
|  | 
 | ||||
|  | #if defined(ENA_NOKIA) || defined(ENA_SSD1306) | ||||
|  | template<class HMSYSTEM> | ||||
|  | class MonochromeDisplay { | ||||
|  |     public: | ||||
|  |         #if defined(ENA_NOKIA) | ||||
|  |         MonochromeDisplay() : mDisplay(U8G2_R0,5,4,16) { | ||||
|  |             mNewPayload = false; | ||||
|  |             mExtra      = 0; | ||||
|  |         } | ||||
|  |         #else // ENA_SSD1306
 | ||||
|  |         MonochromeDisplay() : mDisplay(0x3c, SDA, SCL) { | ||||
|  |             mNewPayload = false; | ||||
|  |             mExtra      = 0; | ||||
|  |             mRx         = 50; | ||||
|  |             mUp         = 1; | ||||
|  |         } | ||||
|  |         #endif | ||||
|  | 
 | ||||
|  |         void setup(HMSYSTEM *sys, uint32_t *utcTs) { | ||||
|  |             mSys   = sys; | ||||
|  |             mUtcTs = utcTs; | ||||
|  |             #if defined(ENA_NOKIA) | ||||
|  |                 mDisplay.begin(); | ||||
|  |                 ShowInfoText("booting..."); | ||||
|  |             #else | ||||
|  |                 mDisplay.init(); | ||||
|  |                 mDisplay.flipScreenVertically(); | ||||
|  |                 mDisplay.setContrast(63); | ||||
|  |                 mDisplay.setBrightness(63); | ||||
|  | 
 | ||||
|  |                 mDisplay.clear(); | ||||
|  |                 mDisplay.setFont(ArialMT_Plain_24); | ||||
|  |                 mDisplay.setTextAlignment(TEXT_ALIGN_CENTER_BOTH); | ||||
|  | 
 | ||||
|  |                 mDisplay.drawString(64,22,"Starting..."); | ||||
|  |                 mDisplay.display(); | ||||
|  |                 mDisplay.setTextAlignment(TEXT_ALIGN_LEFT); | ||||
|  |             #endif | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         void loop(void) { | ||||
|  | 
 | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         void payloadEventListener(uint8_t cmd) { | ||||
|  |             mNewPayload = true; | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         void tickerSecond() { | ||||
|  |             if(mNewPayload) { | ||||
|  |                 mNewPayload = false; | ||||
|  |                 DataScreen(); | ||||
|  |             } | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     private: | ||||
|  |         #if defined(ENA_NOKIA) | ||||
|  |         void ShowInfoText(const char *txt) { | ||||
|  |             /* u8g2_font_open_iconic_embedded_2x_t 'D' + 'G' + 'J' */ | ||||
|  |             mDisplay.clear(); | ||||
|  |             mDisplay.firstPage(); | ||||
|  |             do { | ||||
|  |                 const char *e; | ||||
|  |                 const char *p = txt; | ||||
|  |                 int y=10; | ||||
|  |                 mDisplay.setFont(u8g2_font_5x8_tr); | ||||
|  |                 while(1) { | ||||
|  |                     for(e=p+1; (*e && (*e != '\n')); e++); | ||||
|  |                     size_t len=e-p; | ||||
|  |                     mDisplay.setCursor(2,y); | ||||
|  |                     String res=((String)p).substring(0,len); | ||||
|  |                     mDisplay.print(res); | ||||
|  |                     if ( !*e ) | ||||
|  |                         break; | ||||
|  |                     p=e+1; | ||||
|  |                     y+=12; | ||||
|  |                 } | ||||
|  |                 mDisplay.sendBuffer(); | ||||
|  |             } while( mDisplay.nextPage() ); | ||||
|  |         } | ||||
|  |         #endif | ||||
|  | 
 | ||||
|  |         void DataScreen(void) { | ||||
|  |             String timeStr = ah::getDateTimeStr(*mUtcTs).substring(2, 22); | ||||
|  |             IPAddress ip = WiFi.localIP(); | ||||
|  |             float totalYield = 0.000, totalYieldToday = 0.000, totalActual = 0.0; | ||||
|  |             char fmtText[32]; | ||||
|  |             int  ucnt=0; | ||||
|  | 
 | ||||
|  |             for (uint8_t id = 0; id < mSys->getNumInverters(); id++) { | ||||
|  |                 Inverter<> *iv = mSys->getInverterByPos(id); | ||||
|  |                 if (NULL != iv) { | ||||
|  |                     record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); | ||||
|  |                     uint8_t pos; | ||||
|  |                     uint8_t list[] = {FLD_PAC, FLD_YT, FLD_YD}; | ||||
|  | 
 | ||||
|  |                     if ( !iv->isProducing(*mUtcTs,rec) ) | ||||
|  |                         continue; | ||||
|  | 
 | ||||
|  |                     ucnt++; | ||||
|  | 
 | ||||
|  |                     for (uint8_t fld = 0; fld < 3; fld++) { | ||||
|  |                         pos = iv->getPosByChFld(CH0, list[fld],rec); | ||||
|  | 
 | ||||
|  |                         if(fld == 1) | ||||
|  |                             totalYield += iv->getValue(pos,rec); | ||||
|  |                         if(fld == 2) | ||||
|  |                             totalYieldToday += iv->getValue(pos,rec); | ||||
|  |                         if(fld == 0) | ||||
|  |                             totalActual += iv->getValue(pos,rec); | ||||
|  |                     } | ||||
|  |                 } | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             /* u8g2_font_open_iconic_embedded_2x_t 'D' + 'G' + 'J' */ | ||||
|  |             mDisplay.clear(); | ||||
|  |             #if defined(ENA_NOKIA) | ||||
|  |                 mDisplay.firstPage(); | ||||
|  |                 do { | ||||
|  |                     if(ucnt) { | ||||
|  |                         mDisplay.drawXBMP(10,0,8,17,bmp_arrow); | ||||
|  |                         mDisplay.setFont(u8g2_font_logisoso16_tr); | ||||
|  |                         mDisplay.setCursor(25,16); | ||||
|  |                         sprintf(fmtText,"%3.0f",totalActual); | ||||
|  |                         mDisplay.print(String(fmtText)+F(" W")); | ||||
|  |                         mDisplay.drawHLine(2,20,78); | ||||
|  |                         mDisplay.setFont(u8g2_font_5x8_tr); | ||||
|  |                         mDisplay.setCursor(5,29); | ||||
|  |                         sprintf(fmtText,"%4.0f",totalYieldToday); | ||||
|  |                         mDisplay.print(F("today ")+String(fmtText)+F(" Wh")); | ||||
|  |                         mDisplay.setCursor(5,37); | ||||
|  |                         sprintf(fmtText,"%.1f",totalYield); | ||||
|  |                         mDisplay.print(F("total ")+String(fmtText)+F(" kWh")); | ||||
|  |                     } | ||||
|  |                     else { | ||||
|  |                         mDisplay.setFont(u8g2_font_logisoso16_tr); | ||||
|  |                         mDisplay.setCursor(30,30); | ||||
|  |                         mDisplay.print(F("off")); | ||||
|  |                         mDisplay.setFont(u8g2_font_5x8_tr); | ||||
|  |                     } | ||||
|  |                     if ( !(mExtra%20) ) { | ||||
|  |                         mDisplay.setCursor(5,57); | ||||
|  |                         mDisplay.print(ip); | ||||
|  |                     } | ||||
|  |                     else { | ||||
|  |                         mDisplay.setCursor(0,47); | ||||
|  |                         mDisplay.print(timeStr); | ||||
|  |                     } | ||||
|  | 
 | ||||
|  |                     mDisplay.sendBuffer(); | ||||
|  |                 } while( mDisplay.nextPage() ); | ||||
|  |                 mExtra++; | ||||
|  |         #else // ENA_SSD1306
 | ||||
|  |             if(ucnt) { | ||||
|  |                 mDisplay.setBrightness(63); | ||||
|  |                 mDisplay.drawXbm(10,5,8,17,bmp_arrow); | ||||
|  |                 mDisplay.setFont(ArialMT_Plain_24); | ||||
|  |                 sprintf(fmtText,"%3.0f",totalActual); | ||||
|  |                 mDisplay.drawString(25,0,String(fmtText)+F(" W")); | ||||
|  |                 mDisplay.setFont(ArialMT_Plain_16); | ||||
|  |                 sprintf(fmtText,"%4.0f",totalYieldToday); | ||||
|  |                 mDisplay.drawString(5,22,F("today ")+String(fmtText)+F(" Wh")); | ||||
|  |                 sprintf(fmtText,"%.1f",totalYield); | ||||
|  |                 mDisplay.drawString(5,35,F("total  ")+String(fmtText)+F(" kWh")); | ||||
|  |                 mDisplay.drawLine(2,23,123,23); | ||||
|  |             } | ||||
|  |             else { | ||||
|  |                 if(mUp) { | ||||
|  |                     mRx += 2; | ||||
|  |                     if(mRx >= 70) | ||||
|  |                     mUp = 0; | ||||
|  |                 } else { | ||||
|  |                     mRx -= 2; | ||||
|  |                     if(mRx <= 50) | ||||
|  |                     mUp = 1; | ||||
|  |                 } | ||||
|  |                 mDisplay.setBrightness(1); | ||||
|  |                 mDisplay.setFont(ArialMT_Plain_24); | ||||
|  |                 mDisplay.drawString(mRx, 10, F("off")); | ||||
|  |                 mDisplay.setFont(ArialMT_Plain_16); | ||||
|  |             } | ||||
|  |             if (!(mExtra % 20)) { | ||||
|  |                 mDisplay.drawString(5, 49, ip.toString()); | ||||
|  |             } else { | ||||
|  |                 int w = mDisplay.getStringWidth(timeStr.c_str(), timeStr.length(), 0); | ||||
|  |                 if (w > 127) { | ||||
|  |                     String tt=timeStr.substring(9, 17); | ||||
|  |                     w=mDisplay.getStringWidth(tt.c_str(),tt.length(), 0); | ||||
|  |                     mDisplay.drawString(127 - w, 49, tt); | ||||
|  |                 } else | ||||
|  |                     mDisplay.drawString(0, 49, timeStr); | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             mDisplay.display(); | ||||
|  |             mExtra++; | ||||
|  |         #endif | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         // private member variables
 | ||||
|  |         #if defined(ENA_NOKIA) | ||||
|  |             U8G2_PCD8544_84X48_1_4W_HW_SPI mDisplay; | ||||
|  |         #else // ENA_SSD1306
 | ||||
|  |             SSD1306Wire mDisplay; | ||||
|  |             int mRx; | ||||
|  |             char mUp; | ||||
|  |         #endif | ||||
|  |         int mExtra; | ||||
|  |         bool mNewPayload; | ||||
|  |         uint32_t *mUtcTs; | ||||
|  |         HMSYSTEM *mSys; | ||||
|  | }; | ||||
|  | #endif | ||||
|  | 
 | ||||
|  | #endif /*__MONOCHROME_DISPLAY__*/ | ||||
					Loading…
					
					
				
		Reference in new issue