MicroLog.MyPower.CZ

… designed for freedom of automation.

Uživatelské nástroje

Nástroje pro tento web


source

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Následující verze
Předchozí verze
source [2013/08/24 08:01] – vytvořeno mypower_czsource [2016/04/22 21:34] (aktuální) – upraveno mimo DokuWiki 127.0.0.1
Řádek 1: Řádek 1:
 ====== Microlog2 Source ====== ====== Microlog2 Source ======
  
-Pozor! Tato verze je pracovní a není plně funkč.+===== Info ===== 
 + 
 +Verze 2.04 
 + 
 +===== Kompilace projektu ===== 
 + 
 +**Pozor: Pro kompilaci je potřeba použít [[https://www.arduino.cc/en/Main/OldSoftwareReleases#previous|starší verzi Arduino IDE]], ideálně verzi 1.0.5** 
 + 
 +V nových verzích se můžete setkat s chybou 
 + 
 +  microlog2:897: error: 'WebServer_p' was not declared in this scope 
 + 
 +nebo 
 + 
 +  microlog2:899: error: 'WebServer_p' was not declared in this scope 
 +===== Notes ===== 
 + 
 +  * přidána podpora pro datum a čas, synchronizováno při přenosu na mypower.cz 
 +  * čítač sekund byl změněn na uint32_t 
 +  * mapa eprom byla přesunuta z kódu na [[mod:eprom|wiki]] 
 + 
 +  * [[http://microlog.mypower.cz/source?do=revisions|starší verze]] 
 + 
 +===== Download ===== 
 + 
 +[[http://microlog.mypower.cz/_export/code/source?codeblock=0|download]] 
 + 
 +===== Source =====
  
 <file c microlog2.ino> <file c microlog2.ino>
Řádek 7: Řádek 34:
 // ---[ INFO ]---------------------------------------- // ---[ INFO ]----------------------------------------
  
-// MyPower.CZ Microlog +// Program: MyPower.CZ Microlog2 
-// Version 2.0 +// License: free for non-commercial use 
-// Date05/2013 +// Details: info@mypower.cz
- +
-// created by MyPower.CZ +
-// Licence: free for non-commercial use+
  
 // ---[ VERSION ]------------------------------------- // ---[ VERSION ]-------------------------------------
  
-#define MPWMicroLogVersion     "2.01"+#define MPWMicroLogVersion     "2.04"
  
 // ---[ INCLUDE ]------------------------------------- // ---[ INCLUDE ]-------------------------------------
Řádek 27: Řádek 51:
 // ---[ BUILT-IN CONFIG ]----------------------------- // ---[ BUILT-IN CONFIG ]-----------------------------
  
-int sendInterval = 30; // sec default: 120 +int sendInterval  = 30; // sec default: 120 
-int sendRetry    = 30; // sec default: 30 +int sendRetry     = 30; // sec default: 30 
-byte maxErrors   = 3;  // default: 3+byte maxErrors    = 3;  // default: 3 
 + 
 +byte NETmac[6]    = { 0xF6, 0x88, 0x00, 0x00, 0x00, 0x01 }; 
 +//byte NETip[4]     = { 255, 255, 255, 255 }; // = DHCP 
 +byte NETip[4]     = { 192, 168, 1, 188 };  // { 255, 255, 255, 255 }; // = DHCP 
 +byte NETgw[4]     = { 192, 168, 1, 20 }; 
 +byte NETmask[4]   = { 255, 255, 255, 0 }; 
 +byte NETdns[4]    = { 192, 168, 1, 100 };
  
-byte NETmac[]    = { 0xF60x880x000x000x000x01 };+// ---[ DPIN 22..49 map ]-------------------------- 
 +//                    00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15 
 +//                    [....... LED .....][.not used.][........... RELE .............] 
 +byte DPINmap[16 = { 40424446480,  0,  0,  22, 23, 24, 25, 26, 27, 28, 29 }; 
 +uint16_t DPINstatus    = 0x0000; 
 +//                         <15  08>          <07  >00                           
 +uint16_t DPINlogicmask = (B00000000 << 8) | B00000011;  // pin/bit  0 = standard logic 0 OFF 1 ON,   1 = negative logic 0 ON 1 OFF
  
 // ---[ MODS ]---------------------------------------- // ---[ MODS ]----------------------------------------
  
 // mod MyPowerLog // mod MyPowerLog
-#define modMyPowerLog            // 1=on 0=off +#define modMyPowerLog                         // 1=on 0=off 
-#define modMyPowerHost   "log.mypower.dev+#define modMyPowerHost     "log.mypower.cz    // log.mypower.cz 
-#define modMyPowerFVEID  "mojefve"+#define modMyPowerFVEID    "mojefve1234       // mojefve1234
  
 // mod StausLed // mod StausLed
-#define modStatusLed     1         // 1=on 0=off +#define modStatusLed       1         // 1=on 0=off 
-#define modStatusLedPin  40        // default: 40+#define modStatusLedPin    41        // default: 40
  
 // mod SerialLog // mod SerialLog
-#define modSerialLog     1         // 1=on 0=off +#define modSerialLog       1         // 1=on 0=off 
-#define modSerialForce   1         +#define modSerialForce     1          
 +#define modSerialBaudRate  115200    // 9600  ....  115200
  
 // mod WebServer // mod WebServer
-#define modWebServer     1         // 1=on 0=off +#define modWebServer       1         // 1=on 0=off 
-#define modWebServerPort 80        // default: 80+#define modWebServerPort   80        // default: 80
  
 // mod Display // mod Display
-#define modDisplay       1         // 1=on 0=off +#define modDisplay         1         // 1=on 0=off 
-#define modDisplayType   1602      // typ displaye+#define modDisplayType     1602      // typ displaye 
 + 
 +// mod DisplayEmulation 
 +#define modDisplayEmulation        // 1=display neni fyzicky pripojen - zobrazeni jen na www rozhrani  
 +                                     // 0=display pripojen - zobrazeni na fyzickem displayi i na www rozhrani
  
 // --------------------------------------------------- // ---------------------------------------------------
Řádek 60: Řádek 102:
 byte lxLed=0; byte lxLed=0;
 byte lxTime=0; byte lxTime=0;
-long lxSeconds=0; +uint32_t lxSeconds=0; 
-long lxSendIndex=0;+uint32_t lxSendIndex=0;
 byte lxHttpOk=0; byte lxHttpOk=0;
 byte lxHttpErrors=0; byte lxHttpErrors=0;
Řádek 94: Řádek 136:
 #define xpinOPTsampleG2  B00001000 #define xpinOPTsampleG2  B00001000
 #define xpinOPTsampleG3  B00001100 #define xpinOPTsampleG3  B00001100
- 
-// ---------------------------------------------------- 
- 
-// EEPROM 
- 
-//      0 - 40  PIN0 CONF 
-//     41 - 81  PIN1 CONF 
-//    82 - 122  PIN2 CONF 
-//   123 - 163  PIN3 CONF 
-//   164 - 204  PIN4 CONF 
-//   205 - 245  PIN5 CONF 
-//   246 - 286  PIN6 CONF 
-//   287 - 327  PIN7 CONF 
-//   328 - 368  PIN8 CONF 
-//   369 - 409  PIN9 CONF 
-//   410 - 450  PIN10 CONF 
-//   451 - 491  PIN11 CONF 
-//   492 - 532  PIN12 CONF 
-//   533 - 573  PIN13 CONF 
-//   574 - 614  PIN14 CONF 
-//   615 - 656  PIN15 CONF 
-//   657 - 683  DeviceConf 
-//  684 - 2047  Display program 
-// 2048 - 2057  MyPower Serial Number 
  
 struct tPinConf { struct tPinConf {
Řádek 125: Řádek 143:
 }; };
  
-struct tMpwAccess { +struct tDPinConf { 
-  byte sn[10]+char xname[20]; 
-  unsigned long mpwtime+}; 
-  unsigned long mpwtimeAtMS;+ 
 +#define xComStatusNop               B00000000 
 +#define xComStatusASchanged         B00000001 
 +#define xComStatusDSchanged         B00000010 
 +#define xComStatusIsLastDayInMonth  B00000100 
 +#define xComStatusIsDST             B00001000 
 + 
 +#define xComStatusXXDaysMonthMask   B00110000 
 +#define xComStatus28DaysMonth       B00000000 
 +#define xComStatus29DaysMonth       B00010000 
 +#define xComStatus30DaysMonth       B00100000 
 +#define xComStatus31DaysMonth       B00110000 
 + 
 +struct tMpwAccess {  
 +  byte xComStatus                   //  flags 
 +  uint16_t mpwremoteDateYear        //  2013 ... 
 +   uint8_t mpwremoteDateMonth;        //  1-12 
 +   uint8_t mpwremoteDateDay;          //  1-31 
 +   uint8_t mpwremoteDateWeek;         //  1-53 
 +   uint8_t mpwremoteDateDayOfWeek;    //  1 (for Monday) through 7 (for Sunday) 
 +  signed long mpwremoteTimeS;         //  0-86400, -1 - not known 
 +  uint32_t mpwremoteCheckedAtS;       //  local timeS (seconds counter) 
 +  uint32_t mpwlogintimeS;             //  login local timeS  
 +  uint32_t mpwDeviceId;               //  your device ID on mpw server 
 +  uint32_t mpwAccessId;               //  your access ID on mpw server 
 +} xMpwAccess; 
 + 
 +struct tMpwDateTime {  
 +  int xyear, xmonth, xday, xhour, xminute, xsecond
   };   };
  
Řádek 134: Řádek 180:
 #define xdcOptActive       0x01; #define xdcOptActive       0x01;
  
-struct tSampledPin { +struct tSampledPin { int pin; byte smpHi8[128]; byte smpLo2[32]; unsigned long smpSqr,smpAvg; int smpMin, smpMax, smpCount; }; 
-  int pin; byte smpHi8[128]; byte smpLo2[32]; +struct tPinValue { int smpVal,smpSqr,smpAvg,smpMin,smpMax; unsigned long smpTime; }; 
-  unsigned long smpSqr,smpAvg; int smpMin, smpMax, smpCount; +struct tSamplerStruct { tPinValue tPinValues[NUM_ANALOG_INPUTS]; tSampledPin tPinSamples[4];  
-}; +  byte tPinTimes[128]; unsigned long tPinMicros; } xSamplerStruct;
- +
-struct tPinValue {  +
-  int smpVal,smpSqr,smpAvg,smpMin,smpMax; +
-}; +
- +
-struct tSamplerStruct {  +
-tPinValue tPinValues[NUM_ANALOG_INPUTS]; +
-tSampledPin tPinSamples[4]; +
-byte tPinTimes[128]; +
-unsigned long tPinMicros; +
-}+
- +
-tSamplerStruct xSamplerStruct;+
  
 struct tDeviceConf { struct tDeviceConf {
Řádek 179: Řádek 212:
 char * _lcdweblbuf1=NULL; char * _lcdweblbuf1=NULL;
 tDispStats * _lcdwebdispstats=NULL; tDispStats * _lcdwebdispstats=NULL;
 +
 +#if (modDisplayEmulation == 0)
 #include <LiquidCrystal.h> #include <LiquidCrystal.h>
 LiquidCrystal lcd(8, 9, 14, 5, 6, 7); LiquidCrystal lcd(8, 9, 14, 5, 6, 7);
 +void lcdClear() { lcd.clear(); }
 +void lcdInit() { lcd.begin(16, 2); lcdClear(); }
 +#else
 +void lcdClear() { }
 +void lcdInit() { lcdClear(); }
 +#endif
 +
 void lcdPrintRight(char * str) { int x=16-strlen(str); lcdPrintAt(str,(x<0?0:x)); } void lcdPrintRight(char * str) { int x=16-strlen(str); lcdPrintAt(str,(x<0?0:x)); }
 void lcdPrintCenter(char * str) { int x=8-(strlen(str)/2); lcdPrintAt(str,(x<0?0:x)); } void lcdPrintCenter(char * str) { int x=8-(strlen(str)/2); lcdPrintAt(str,(x<0?0:x)); }
Řádek 186: Řádek 228:
 void lcdPrintAt(char * str,int x) {  void lcdPrintAt(char * str,int x) { 
   int ix=strlen(str);for (int i=0;((i+x<sizeof(_lcdlbuf)-1) && (i<ix));i++) if (x>=0) _lcdlbuf[i+x]=str[i]; }   int ix=strlen(str);for (int i=0;((i+x<sizeof(_lcdlbuf)-1) && (i<ix));i++) if (x>=0) _lcdlbuf[i+x]=str[i]; }
-void lcdClear() { lcd.clear(); }+//  int ix=strlen(str);for (int i=0;((i+x<sizeof(_lcdlbuf)-1) && (i<ix));i++) if ((x+i)>=0_lcdlbuf[i+x]=str[i]; } ??????
 void lcdClearLine() { int i; for (i=0;i<sizeof(_lcdlbuf)-1;i++) _lcdlbuf[i]=32; _lcdlbuf[i]=0; } void lcdClearLine() { int i; for (i=0;i<sizeof(_lcdlbuf)-1;i++) _lcdlbuf[i]=32; _lcdlbuf[i]=0; }
 void lcdPrintLine(int y) {  void lcdPrintLine(int y) { 
   if ((_lcdweblbuf0!=NULL) && (_lcdweblbuf1!=NULL))   if ((_lcdweblbuf0!=NULL) && (_lcdweblbuf1!=NULL))
     { char * p=_lcdweblbuf0; if (y==1) p=_lcdweblbuf1;strcpy(p,_lcdlbuf); }     { char * p=_lcdweblbuf0; if (y==1) p=_lcdweblbuf1;strcpy(p,_lcdlbuf); }
-  else { lcd.setCursor(0,y); lcd.print(_lcdlbuf); } } +  else {  
-void lcdInit() { lcd.begin(16, 2); lcdClear(); }+#if (modDisplayEmulation == 0)  
 +  lcd.setCursor(0,y); lcd.print(_lcdlbuf);  
 +#endif 
 +} } 
 #endif #endif
  
Řádek 205: Řádek 251:
 pinMode(modStatusLedPin, OUTPUT); SetLiveLed(HIGH); pinMode(modStatusLedPin, OUTPUT); SetLiveLed(HIGH);
 #endif #endif
 +
  
 #if ((modSerialLog == 1) || (modSerialForce == 1)) #if ((modSerialLog == 1) || (modSerialForce == 1))
-Serial.begin(9600);+Serial.begin(modSerialBaudRate);
 #endif #endif
 +
  
 #if ((modSerialLog == 1) || (modDisplay == 1)) #if ((modSerialLog == 1) || (modDisplay == 1))
Řádek 215: Řádek 263:
  
 #if (modSerialLog == 1) #if (modSerialLog == 1)
-XLog(sn1);XLog(sn2); +XLog(sn1);XLog(sn2);XLog(MPWMicroLogVersion); 
-XLog(MPWMicroLogVersion);+
 #if (modMyPowerLog == 1) #if (modMyPowerLog == 1)
-XLog("+mpwlog");+xMpwAccess.mpwremoteDateYear=0; 
 +xMpwAccess.mpwremoteDateMonth=0; 
 +xMpwAccess.mpwremoteDateDay=0; 
 +xMpwAccess.mpwremoteDateWeek=0; 
 +xMpwAccess.mpwremoteDateDayOfWeek=0; 
 +xMpwAccess.mpwremoteTimeS=-1; 
 +xMpwAccess.mpwremoteCheckedAtS=0; 
 +xMpwAccess.mpwlogintimeS=0; 
 +xMpwAccess.mpwDeviceId=0; 
 +xMpwAccess.mpwAccessId=0; 
 +xMpwAccess.xComStatus=xComStatusNop; 
 +char cx[50]="+mpwlog ";strcat(cx,modMyPowerHost);XLog(cx);
 #endif #endif
 +
 #if (modDisplay == 1) #if (modDisplay == 1)
-XLog("+disp");+char ccx[50]=""; 
 +#if (modDisplayEmulation == 1 ) 
 +sprintf(ccx,"+dispemu @ %04d",modDisplayType); 
 +#else 
 +sprintf(ccx,"+disp @ %04d",modDisplayType);
 #endif #endif
-XLog("DHCP?");+XLog(ccx); 
 +#endif 
 #endif #endif
  
Řádek 234: Řádek 300:
 #endif #endif
  
-pinMode(10, OUTPUT);digitalWrite(10,HIGH); +DPINResetHW(); 
-int xret=Ethernet.begin(NETmac);+pinMode(53, OUTPUT);digitalWrite(53,HIGH); 
 + 
 +int xret=0; 
 + 
 +boolean isdhcp=((NETip[0]&NETip[1]&NETip[2]&NETip[3])==255); 
 + 
 +if (isdhcp) 
 +  { 
 +#if (modSerialLog == 1) 
 +XLog("DHCP?"); 
 +#endif 
 +xret=Ethernet.begin(NETmac); 
 +  } 
 +else 
 +  { 
 +  Ethernet.begin(NETmac, NETip, NETdns, NETgw, NETmask); 
 +  xret=1; 
 +  delay(1000); 
 +  } 
 W5100.setRetransmissionTime(0x07FF); W5100.setRetransmissionTime(0x07FF);
 W5100.setRetransmissionCount(2);  W5100.setRetransmissionCount(2); 
-if (xret == 0) {+ 
 +if (xret == 0) && (isdhcp) ) {
 #if modSerialLog == 1 #if modSerialLog == 1
   XLog("No dhcp.");   XLog("No dhcp.");
Řádek 265: Řádek 351:
 server.begin(); server.begin();
 #if modSerialLog == 1 #if modSerialLog == 1
-char c[30]="";sprintf(c,"+www@%d",modWebServerPort);XLog(c);+char c[30]="";sprintf(c,"+www @ %d",modWebServerPort);XLog(c);
 #endif #endif
 #endif #endif
 +
 +SamplerReset();
 +
 #if modSerialLog == 1 #if modSerialLog == 1
 XLog("Done."); XLog("Done.");
Řádek 336: Řádek 425:
 #if modMyPowerLog==1 #if modMyPowerLog==1
 void SendDataToMyPower() void SendDataToMyPower()
-{+ 
 +boolean canrun=true;  
 +for (int xp=0;xp<NUM_ANALOG_INPUTS;xp++) 
 +  if (xSamplerStruct.tPinValues[xp].smpTime==0) 
 +    { canrun=false;break;
 +if (canrun) SendDataToMyPower_int();  
 +
 + 
 +void SendDataToMyPower_int() 
 +{  
 char xtext[200];  char xtext[200]; 
 int xsi=sendInterval; int xsi=sendInterval;
Řádek 343: Řádek 441:
 if (lxHttpOk==2) xsi=xsr; if (lxHttpOk==2) xsi=xsr;
 if (xsi<30) xsi=30; if (xsi<30) xsi=30;
-long qlxSendIndex=lxSeconds;+uint32_t qlxSendIndex=lxSeconds;
 if ((lxSendIndex+xsi<=qlxSendIndex) || (lxHttpOk==0)) if ((lxSendIndex+xsi<=qlxSendIndex) || (lxHttpOk==0))
   {   {
Řádek 361: Řádek 459:
       modMyPowerHost,MPWMicroLogVersion,modMyPowerFVEID);       modMyPowerHost,MPWMicroLogVersion,modMyPowerFVEID);
     client.write((byte*)xtext,strlen(xtext));       client.write((byte*)xtext,strlen(xtext));  
-    strcpy(xtext,"AIN="); 
-    boolean xf=false; 
-    char p[10]; 
-    for (int xpin=0;xpin<NUM_ANALOG_INPUTS;xpin++) { 
-      if (xf) strcat(xtext,"."); else xf=true; 
-      sprintf(p,"%d",SamplerAnalogRead(xpin)); 
-      strcat(xtext,p); 
-      } 
-    client.write((byte*)xtext,strlen(xtext));    
  
-    strcpy(xtext,"; "); +    boolean islogin=(xMpwAccess.mpwlogintimeS==0); 
-    client.write((byte*)xtext,strlen(xtext)); + 
-    +if (islogin) 
 +  { 
 +  strcpy(xtext,"cdate=" __DATE__ " " __TIME__ ";"); 
 +  for (int i=0;i<strlen(xtext);i++) 
 +    if (xtext[i]==' ') xtext[i]='_'; 
 +  strcat(xtext," "); 
 +  client.write((byte*)xtext,strlen(xtext)); 
 +  client.write("login=yes; "); 
 +  } 
 +  
 +      sprintf(xtext,"utime=%lu/%lu; ",millis(),lxSeconds); 
 +      client.write((byte*)xtext,strlen(xtext)); 
 +      sprintf(xtext,"AX=VSAMX; "); 
 +      client.write((byte*)xtext,strlen(xtext)); 
     for (int xp=0;xp<NUM_ANALOG_INPUTS;xp++)     for (int xp=0;xp<NUM_ANALOG_INPUTS;xp++)
       {       {
Řádek 379: Řádek 482:
       tPinValue * qPinValue;       tPinValue * qPinValue;
       qPinValue=&xSamplerStruct.tPinValues[xp];       qPinValue=&xSamplerStruct.tPinValues[xp];
-      sprintf(xtext,"A%d=V:%d,S:%d,A:%d,M:%d,X:%d,C:",xp, +      sprintf(xtext,"A%d=%X,%X,%X,%X,%X",xp, 
-        qPinValue->smpVal, +        qPinValue->smpVal,qPinValue->smpSqr,qPinValue->smpAvg,qPinValue->smpMin,qPinValue->smpMax);
-        qPinValue->smpSqr, +
-        qPinValue->smpAvg, +
-        qPinValue->smpMin, +
-        qPinValue->smpMax);+
       client.write((byte*)xtext,strlen(xtext));       client.write((byte*)xtext,strlen(xtext));
  
 +if ( (islogin) || ((xMpwAccess.xComStatus&xComStatusASchanged)!=0) )
 +  {
       tPinConf pconf;                   tPinConf pconf;            
       boolean isvalid=ReadPinConf(&pconf,xp);                   boolean isvalid=ReadPinConf(&pconf,xp);            
-      if (!isvalid) +      if (isvalid)
-        strcat(xtext,"-"); +
-      else+
         {          { 
-        sprintf(xtext,"%X/%ld.%d/%ld.%d/",pconf.xopt,pconf.xmin, +        char smin10k[30]="";sprint10k(smin10k,pconf.xmin,pconf.xmin10000); 
-          pconf.xmin10000,pconf.xmax,pconf.xmax10000);+        char smax10k[30]="";sprint10k(smax10k,pconf.xmax,pconf.xmax10000); 
 +//        sprintf(xtext,"AC%d=%X/%ld.%04d/%ld.%04d/",xp,pconf.xopt,pconf.xmin,pconf.xmin10000,pconf.xmax,pconf.xmax10000); 
 +        sprintf(xtext,"AC%d=%X/%s/%s/",xp,pconf.xopt,smin10k,smax10k);
         client.write((byte*)xtext,strlen(xtext));         client.write((byte*)xtext,strlen(xtext));
         xtext[0]=0;         xtext[0]=0;
Řádek 401: Řádek 502:
         byte * p;         byte * p;
         p=(byte*)pconf.xname;         p=(byte*)pconf.xname;
-        for (int i=0;i<strlen(pconf.xname);i++) { +        for (int i=0;i<strlen(pconf.xname);i++) { sprintf(xh,xf,p[i]); strcat(xtext,xh); }
-          sprintf(xh,xf,p[i]); strcat(xtext,xh); }+
         client.write((byte*)xtext,strlen(xtext));         client.write((byte*)xtext,strlen(xtext));
         strcpy(xtext,"/");         strcpy(xtext,"/");
         p=(byte*)pconf.xunit;         p=(byte*)pconf.xunit;
-        for (int i=0;i<strlen(pconf.xunit);i++) { +        for (int i=0;i<strlen(pconf.xunit);i++) { sprintf(xh,xf,p[i]); strcat(xtext,xh); } 
-          sprintf(xh,xf,p[i]); strcat(xtext,xh); }+        client.write((byte*)xtext,strlen(xtext)); 
 +        client.write("; ");
         }                       }              
-      strcat(xtext,"; "); +  }
-      client.write((byte*)xtext,strlen(xtext));+
       }       }
 +  
 +    xMpwAccess.xComStatus&=~xComStatusASchanged;
          
-    strcpy(xtext,"\r\n\r\n"); +    client.write("\r\n\r\n");
-    client.write((byte*)xtext,strlen(xtext));+
              
     int lbufpos=0;     int lbufpos=0;
Řádek 474: Řádek 575:
  
 void ParseHTTPResult(char * xtext) {  void ParseHTTPResult(char * xtext) { 
-if (strcmp(xtext,"result:OK")==0) lxHttpOk=1; 
 #if modSerialLog == 1 #if modSerialLog == 1
 XLog2(xtext,"# "); XLog2(xtext,"# ");
 #endif #endif
 +if (strcmp(xtext,"result:OK")==0) lxHttpOk=1; else
 +if (strncmp(xtext,"qid:",4)==0) ParseQID(xtext+4);
 +}
 +
 +void ParseQID(char * xtext) {
 +if (xMpwAccess.mpwlogintimeS==0) xMpwAccess.mpwlogintimeS=lxSeconds;
 +char * p=strchr(xtext,'.');
 +if (p!=NULL)
 +  {  
 +  p[0]=0;
 +  xMpwAccess.mpwDeviceId=atol(xtext);
 +  p++;
 +  char * px=strchr(p,'.');
 +  if (px!=NULL)
 +    {
 +    px[0]=0;
 +    px++;
 +    xMpwAccess.mpwAccessId=atol(p);
 +    if (strlen(px)==20)
 +      {
 +      char c[30]="";
 +      strncpy(c,px,4);c[4]=0;xMpwAccess.mpwremoteDateYear=atoi(c);px+=4;
 +      strncpy(c,px,2);c[2]=0;xMpwAccess.mpwremoteDateMonth=atoi(c);px+=2;
 +      strncpy(c,px,2);c[2]=0;xMpwAccess.mpwremoteDateDay=atoi(c);px+=2;
 +      strncpy(c,px,2);c[2]=0;signed long xhour=atoi(c);px+=2;
 +      strncpy(c,px,2);c[2]=0;signed long xminute=atoi(c);px+=2;
 +      strncpy(c,px,2);c[2]=0;signed long xsecond=atoi(c);px+=2;
 +      strncpy(c,px,2);c[2]=0;byte xdaysinmonth=atoi(c);px+=2;
 +      strncpy(c,px,1);c[1]=0;byte xisdst=atoi(c);px+=1;
 +      strncpy(c,px,1);c[1]=0;xMpwAccess.mpwremoteDateDayOfWeek=atoi(c);px+=1;
 +      strncpy(c,px,2);c[2]=0;xMpwAccess.mpwremoteDateWeek=atoi(c);px+=2;
 +
 +      if (xisdst==1)
 +        xMpwAccess.xComStatus|=xComStatusIsDST;
 +      else
 +        xMpwAccess.xComStatus&=~xComStatusIsDST;
 +
 +      if (xdaysinmonth==xMpwAccess.mpwremoteDateDay)
 +        xMpwAccess.xComStatus|=xComStatusIsLastDayInMonth;
 +      else
 +        xMpwAccess.xComStatus&=~xComStatusIsLastDayInMonth;
 +        
 +      xMpwAccess.xComStatus&=~xComStatusXXDaysMonthMask;
 +      if (xdaysinmonth==28) xMpwAccess.xComStatus|=xComStatus28DaysMonth;
 +      if (xdaysinmonth==29) xMpwAccess.xComStatus|=xComStatus29DaysMonth;
 +      if (xdaysinmonth==30) xMpwAccess.xComStatus|=xComStatus30DaysMonth;
 +      if (xdaysinmonth==31) xMpwAccess.xComStatus|=xComStatus31DaysMonth;
 +        
 +      xMpwAccess.mpwremoteTimeS=(xhour*3600)+(xminute*60)+(xsecond);
 +      xMpwAccess.mpwremoteCheckedAtS=lxSeconds;
 +      }
 +    }
 +  
 +  }
 +
 +/*  
 +char xstr[50]="";
 +tMpwDateTime xMpwDateTime;
 +GetCurrentDateTime(&xMpwDateTime);
 +FormatDateTimeStr(xstr, "j.n.Y H:i:s",&xMpwDateTime,sizeof(xstr));
 +Serial.println(xstr);
 +*/
 } }
 #endif #endif
 +
 +
 +
 +void FormatDateTimeStr(char * xstr, char * xfmt, struct tMpwDateTime * xMpwDateTime,int xmaxlen)
 +{
 +xstr[0]=0;
 +while (strlen(xfmt)>0)
 +  {
 +  char ch=xfmt[0];
 +  char cout[20]="";
 +  if (ch=='d') sprintf(cout,"%02d",xMpwDateTime->xday); else
 +  if (ch=='j') sprintf(cout,"%d",xMpwDateTime->xday); else
 +  if (ch=='m') sprintf(cout,"%02d",xMpwDateTime->xmonth); else
 +  if (ch=='n') sprintf(cout,"%d",xMpwDateTime->xmonth); else
 +  if (ch=='Y') sprintf(cout,"%d",xMpwDateTime->xyear); else
 +  if (ch=='y') sprintf(cout,"%d",xMpwDateTime->xyear%99); else
 +  if (ch=='g') sprintf(cout,"%d",((xMpwDateTime->xhour%12)+1)); else
 +  if (ch=='G') sprintf(cout,"%d",(xMpwDateTime->xhour)); else
 +  if (ch=='h') sprintf(cout,"%02d",((xMpwDateTime->xhour%12)+1)); else
 +  if (ch=='H') sprintf(cout,"%02d",(xMpwDateTime->xhour)); else
 +  if (ch=='i') sprintf(cout,"%02d",(xMpwDateTime->xminute)); else
 +  if (ch=='s') sprintf(cout,"%02d",(xMpwDateTime->xsecond)); else
 +    { cout[0]=ch;cout[1]=0; }
 +    
 +  xfmt++;
 +  if (strlen(xstr)+strlen(cout)<xmaxlen) strcat(xstr,cout); else break;
 +  }
 +}
 +
 +int GetCurrentDateTime_DaysInMonth()
 +{
 +int xret=28;
 +int xst=xMpwAccess.xComStatus&xComStatusXXDaysMonthMask;
 +if (xst==xComStatus28DaysMonth) xret=28; else
 +if (xst==xComStatus29DaysMonth) xret=29; else
 +if (xst==xComStatus30DaysMonth) xret=30; else
 +if (xst==xComStatus31DaysMonth) xret=31;
 +return xret;
 +}
 + 
 +void GetCurrentDateTime(struct tMpwDateTime * xMpwDateTime)
 +{
 +if (xMpwAccess.mpwremoteCheckedAtS>0)
 +  {
 +  xMpwDateTime->xyear=xMpwAccess.mpwremoteDateYear;
 +  xMpwDateTime->xmonth=xMpwAccess.mpwremoteDateMonth;
 +  xMpwDateTime->xday=xMpwAccess.mpwremoteDateDay;
 +  uint32_t xtime=lxSeconds-xMpwAccess.mpwremoteCheckedAtS+xMpwAccess.mpwremoteTimeS;
 +  if (xtime>=86400)
 +    {
 +    int xdaysover=xtime/86400UL;
 +    int xtimeover=xtime%86400UL;
 +
 +    if (xdaysover>25) // max 25 days without time sync
 +      {
 +      xMpwDateTime->xyear=0;
 +      xMpwDateTime->xmonth=0;
 +      xMpwDateTime->xday=0;
 +      }
 +    else
 +      { 
 +      int xdaysinmonth=GetCurrentDateTime_DaysInMonth();
 +      for (int i=0;i<xdaysover;i++)
 +        {
 +        if (xMpwDateTime->xday<xdaysinmonth)
 +          xMpwDateTime->xday++;  
 +        else
 +          {
 +          xMpwDateTime->xday=1;
 +          if (xMpwDateTime->xmonth<12)
 +            xMpwDateTime->xmonth++;
 +          else
 +            {
 +            xMpwDateTime->xmonth=1;
 +            xMpwDateTime->xyear++;
 +            }
 +          }
 +        }
 +      }
 +  
 +    xtime=xtimeover;
 +    }
 +  xMpwDateTime->xhour=(xtime/3600)%24;
 +  int xmod=(xtime%3600);
 +  xMpwDateTime->xminute=(xmod/60)%60;
 +  xMpwDateTime->xsecond=xmod%60;
 +  }
 +else
 +  {
 +  uint32_t xtime=lxSeconds;
 +  xMpwDateTime->xyear=0;
 +  xMpwDateTime->xmonth=0;
 +  xMpwDateTime->xday=(xtime/86400UL);
 +  xMpwDateTime->xhour=((xtime%86400UL)/3600)%24;
 +  signed long xmod=((xtime%86400L)%3600);
 +  xMpwDateTime->xminute=(xmod/60)%60;
 +  xMpwDateTime->xsecond=xmod%60;    
 +  }
 +}
 +
 +
 +
 +
  
 void FlashError(byte xcount) void FlashError(byte xcount)
Řádek 530: Řádek 795:
 //  int xs=(xpin*sp); //  int xs=(xpin*sp);
   int xs=GetEpromPinAddr(xpin);   int xs=GetEpromPinAddr(xpin);
-  for (int ax=0;ax<sp;ax++) pcx[ax]=EEPROM.read(ax+xs); +  if (xs>=0) 
-  xret=(calcPchsum(xpin, pconf)==pconf->chsum);+    { 
 +    for (int ax=0;ax<sp;ax++) pcx[ax]=EEPROM.read(ax+xs); 
 +    xret=(calcPchsum(xpin, pconf)==pconf->chsum); 
 +    }
   }   }
 return xret; return xret;
Řádek 538: Řádek 806:
 int GetEpromPinAddr(int xpin) int GetEpromPinAddr(int xpin)
 { {
-boolean xret=-1;+int xret=-1;
 if (xpin<NUM_ANALOG_INPUTS) if (xpin<NUM_ANALOG_INPUTS)
   xret=(xpin*sizeof(tPinConf));   xret=(xpin*sizeof(tPinConf));
Řádek 560: Řádek 828:
 #define xCFGv      0x20 #define xCFGv      0x20
 #define xCFGs      0x30 #define xCFGs      0x30
 +
 +// w = write
 +// [w]as = analog settings
 +// [w]ds = digital settings
 +// [w]dp = display
 +// [w]ep = eprom
 +// hw = hwinfo
 +// dd = display dump
 +// db = display button press emulation
  
 #define xACTnone   0x00 #define xACTnone   0x00
Řádek 568: Řádek 845:
 #define xACTdb     0x05 #define xACTdb     0x05
 #define xACTsp     0x06 #define xACTsp     0x06
 +#define xACTds     0x07
 +#define xACTep     0x08
  
 +#define xACTwds    0x0C
 +#define xACTwep    0x0D
 #define xACTwas    0x0E #define xACTwas    0x0E
 #define xACTwdp    0x0F #define xACTwdp    0x0F
  
-#define xKEYnone        0x00 +#define xKEYnone          0x00 
-#define xKEYcmd         0x10 +#define xKEYcmd           0x10 
-#define xKEYpin         0x20 +#define xKEYpin           0x20 
-#define xKEYDispButt    0x30+#define xKEYDispButt      0x30 
 +#define xKEYDpin          0x40
  
-#define xPinOptNone     0x00 +#define xPinOptNone       0x00 
-#define xPinOptEnabled  0x01 +#define xPinOptEnabled    0x01 
-#define xPinOptName     0x02 +#define xPinOptName       0x02 
-#define xPinOptMin      0x03 +#define xPinOptMin        0x03 
-#define xPinOptMax      0x04 +#define xPinOptMax        0x04 
-#define xPinOptUnit     0x05 +#define xPinOptUnit       0x05 
-#define xPinOptType     0x06 +#define xPinOptType       0x06 
-#define xPinOptGroup    0x07 +#define xPinOptGroup      0x07 
-#define xPinCmdWrite    0xF0+#define xPinCmdWrite      0xF0
  
-void WebServer_pf(char * xstr,signed long * xsl,int * xsl10000) { +#define xDPinOptNone      0x00 
-int im; *xsl=0;*xsl10000=0; char * p=xstr; char * p10k=p;+#define xDPinOptName      0x02 
 + 
 +#define xDPinOptSetStatus 0xA0 
 + 
 +#define xDPinSetStatus    0xE0 
 + 
 +void WebServer_pf(char * xstr,signed long * xsl,int * xsl10k) { 
 +int im; *xsl=0;*xsl10k=0; char * p=xstr; char * p10k=p;
 for (int i=0;i<strlen(xstr);i++) if (p10k[0]=='.') { p10k[0]=0;p10k++;break; } else p10k++; for (int i=0;i<strlen(xstr);i++) if (p10k[0]=='.') { p10k[0]=0;p10k++;break; } else p10k++;
 boolean hm=(p[0]=='-'); if (hm) { p++; } im=strlen(p); boolean hm=(p[0]=='-'); if (hm) { p++; } im=strlen(p);
 for (int i=0;i<im;i++) { *xsl*=10; if ((p[i]>='0') && (p[i]<='9')) *xsl+=(p[i]-'0'); } for (int i=0;i<im;i++) { *xsl*=10; if ((p[i]>='0') && (p[i]<='9')) *xsl+=(p[i]-'0'); }
 im=strlen(p10k); im=strlen(p10k);
-for (int i=0;i<4;i++) { *xsl10000*=10; if ((i<im) && ((p10k[i]>='0') && (p10k[i]<='9')))  +for (int i=0;i<4;i++) { *xsl10k*=10; if ((i<im) && ((p10k[i]>='0') && (p10k[i]<='9')))  
-  *xsl10000+=(p10k[i]-'0'); }+  *xsl10k+=(p10k[i]-'0'); }
 if (hm) *xsl=0-*xsl; if (hm) *xsl=0-*xsl;
 +if (hm) *xsl10k=0-*xsl10k; // minus bugfix
 } }
  
 void WebServer_wp(byte xpin, struct tPinConf * pconf) { void WebServer_wp(byte xpin, struct tPinConf * pconf) {
 if (xpin<NUM_ANALOG_INPUTS) { if (xpin<NUM_ANALOG_INPUTS) {
 +  xMpwAccess.xComStatus|=xComStatusASchanged;
   byte*xconf=(byte*)pconf; pconf->chsum=calcPchsum(xpin,pconf);   byte*xconf=(byte*)pconf; pconf->chsum=calcPchsum(xpin,pconf);
-//  int ax=xpin*sizeof(tPinConf); 
   int ax=GetEpromPinAddr(xpin);   int ax=GetEpromPinAddr(xpin);
-  for (int ii=0;ii<sizeof(tPinConf);ii++) +  if (ax>=0) 
-    if (EEPROM.read(ax+ii) != xconf[ii]) +    for (int ii=0;ii<sizeof(tPinConf);ii++) 
-      EEPROM.write(ax+ii,xconf[ii]);+      if (EEPROM.read(ax+ii) != xconf[ii]) 
 +        EEPROM.write(ax+ii,xconf[ii]);
   }   }
 } }
  
 +void WebServer_wdp(byte xdpin, struct tDPinConf * pconf) {
 +if (xdpin<16) {
 +  xMpwAccess.xComStatus|=xComStatusDSchanged;
 +  DPIN_epWriteConfName(xdpin,pconf->xname);
 +  }
 +}
  
 byte WebServer_pb(char * xstr) { byte WebServer_pb(char * xstr) {
Řádek 656: Řádek 953:
   }   }
 #endif #endif
 +}
 +
 +unsigned long WebServer_ph(char * lbuf)
 +{
 +unsigned long d=0;
 +for (byte ii=0;ii<8;ii++) {
 +  char c=lbuf[ii];
 +  if (c='\0') break;
 +  d=(d<<4)+(((c>='0') && (c<='9'))?(c-'0'):(((c>='A') && (c<='F'))?(c-'A'+10):0));
 +  }
 +return d;
 } }
  
Řádek 728: Řádek 1036:
   else   else
 #endif #endif
 +  if (*qsaction==xACTwds)
 +    {
 +    char * p=xstr;
 +    if (strcmp(xstr,"DX")==0)
 +      {
 +      byte xpinopt=xDPinSetStatus;
 +      *xparam&=0xFFFFFF00;
 +      *xparam|=xpinopt;
 +      }
 +    else
 +    if (p[0]=='s')
 +      {
 +      p++;
 +      int xpinindex=atoi(p)&0x0F;
 +      byte xpinopt=xDPinOptSetStatus;
 +      *xparam&=0xFFFF0000;
 +      *xparam|=xpinopt|(xpinindex<<8);
 +      }
 +    else
 +    if (p[0]=='D')
 +      {
 +      p++;
 +      char * px=p;
 +      for (int ii=1;ii<strlen(xstr);ii++)
 +        if (p[0]=='.') { p[0]=0;p++;break; } else p++;
 +      int xpinindex=atoi(px);
 +      byte xpinopt=xDPinOptNone;
 +      if (strcmp(p,"nam")==0) xpinopt=xDPinOptName;
 +      *xparam&=0xFFFF0000;
 +      *xparam|=xpinopt|(xpinindex<<8);
 +      }   
 +    *wkey=xKEYDpin;
 +    }
 +  else
   if (*qsaction==xACTwas)   if (*qsaction==xACTwas)
     {     {
Řádek 769: Řádek 1111:
 #endif #endif
  
 +// ---------------------------------------
 +
 +  if (*wkey==xKEYDpin) 
 +    {
 +    byte xpk=((*xparam)&0xFF);
 +    tDPinConf * pconf;
 +    pconf=(tDPinConf*)datastruct;
 +    
 +if (xpk==xDPinOptName)
 +  {
 +  int xpinindex=(((*xparam)&0x0F00)>>8);
 +  strncpy(pconf->xname,xstr,sizeof(pconf->xname)-1);
 +  DPIN_epWriteConfName(xpinindex,pconf->xname);
 +  for (int ii=0;ii<sizeof(tDPinConf);ii++) datastruct[ii]=0;  
 +  }
 +else
 +if (xpk==xDPinSetStatus) {
 +  DPINstatus=(uint16_t)WebServer_ph(xstr);
 +  DPINUpdateHW();  
 +  }
 +else
 +if (xpk==xDPinOptSetStatus) {
 +  int xpinindex=(((*xparam)&0x0F00)>>8);
 +  uint16_t xpinstatus=(atoi(xstr))&1;
 +  DPINstatus&=(~(((uint16_t)1)<<xpinindex));
 +  DPINstatus|=(xpinstatus<<xpinindex);
 +  DPINUpdateHW();  
 +  }
 +
 +  
 +    }   
 +else
 +// ---------------------------------------
   if (*wkey==xKEYpin)    if (*wkey==xKEYpin) 
     {     {
Řádek 781: Řádek 1156:
 else else
 if (xpk==xPinOptName) if (xpk==xPinOptName)
 +  {
   strncpy(pconf->xname,xstr,sizeof(pconf->xname)-1);   strncpy(pconf->xname,xstr,sizeof(pconf->xname)-1);
 +  pconf->xname[sizeof(pconf->xname)-1]=0;
 +  }
 else else
 if (xpk==xPinOptMin) { if (xpk==xPinOptMin) {
Řádek 823: Řádek 1201:
   }   }
      
-    }+    }    
 + // --------------------------------------------
   else   else
   if (*wkey==xKEYcmd)    if (*wkey==xKEYcmd) 
     {     {
 +    if (strcmp(xstr,"wep")==0) *qsaction=xACTwep;else
 +    if (strcmp(xstr,"wds")==0) *qsaction=xACTwds;else
     if (strcmp(xstr,"was")==0) *qsaction=xACTwas;else     if (strcmp(xstr,"was")==0) *qsaction=xACTwas;else
     if (strcmp(xstr,"wdp")==0) *qsaction=xACTwdp;else     if (strcmp(xstr,"wdp")==0) *qsaction=xACTwdp;else
     if (strcmp(xstr,"hw")==0) *qsaction=xACThw;else     if (strcmp(xstr,"hw")==0) *qsaction=xACThw;else
     if (strcmp(xstr,"as")==0) *qsaction=xACTas;else     if (strcmp(xstr,"as")==0) *qsaction=xACTas;else
 +    if (strcmp(xstr,"ds")==0) *qsaction=xACTds;else
     if (strcmp(xstr,"dp")==0) *qsaction=xACTdp; else     if (strcmp(xstr,"dp")==0) *qsaction=xACTdp; else
     if (strcmp(xstr,"sp")==0) *qsaction=xACTsp; else     if (strcmp(xstr,"sp")==0) *qsaction=xACTsp; else
-    if (strcmp(xstr,"dd")==0) *qsaction=xACTdd; else +    if (strcmp(xstr,"dd")==0) *qsaction=xACTdd; else 
 +    if (strcmp(xstr,"ep")==0) *qsaction=xACTep; else
     if (strcmp(xstr,"db")==0) *qsaction=xACTdb;         if (strcmp(xstr,"db")==0) *qsaction=xACTdb;    
     }     }
Řádek 847: Řádek 1230:
     unsigned long xparam=0;     unsigned long xparam=0;
     int cx=sizeof(tPinConf);     int cx=sizeof(tPinConf);
 +    int cxq=sizeof(tDPinConf);if (cx<cxq) cx=cxq;
     byte xDataStruct[cx];     byte xDataStruct[cx];
     for (int ii=0;ii<cx;ii++) xDataStruct[ii]=0;      for (int ii=0;ii<cx;ii++) xDataStruct[ii]=0; 
Řádek 863: Řádek 1247:
         byte qsaction=(xmode>>8)&0x0F;          byte qsaction=(xmode>>8)&0x0F; 
         if (c == '\n' && cl) {         if (c == '\n' && cl) {
-          client.write("HTTP/1.1 200 OK\nContent-Type: text/html\nConnnection: close\n\n");+          client.write("HTTP/1.1 200 OK\n"); 
 +          if (qsaction==xACTep) 
 +            { 
 +            client.write("Content-Disposition: attachment; filename=\""); 
 +            sprintf(xln,"ulog_eprom_%08lX.hex",millis()); 
 +            client.write((byte*)xln,strlen(xln)); 
 +            client.write("\"\n"); 
 +            client.write("Content-Type: text/plain\nConnnection: close\n\n");               
 +            } 
 +          else 
 +            client.write("Content-Type: text/html\nConnnection: close\n\n");
           if (qmode==xWEBpins) {           if (qmode==xWEBpins) {
             for (int ain = 0; ain < NUM_ANALOG_INPUTS; ain++) {             for (int ain = 0; ain < NUM_ANALOG_INPUTS; ain++) {
Řádek 880: Řádek 1274:
             (int)lxHttpErrors,(int)modSerialLog,(int)modDisplay,(modDisplay==1)?(int)modDisplayType:(int)0);             (int)lxHttpErrors,(int)modSerialLog,(int)modDisplay,(modDisplay==1)?(int)modDisplayType:(int)0);
             client.write((byte*)xln,strlen(xln));             client.write((byte*)xln,strlen(xln));
-            sprintf(xln,".%lu\nf:%s\nh:%s\nx:%d\nr:",(long)lxSeconds,modMyPowerFVEID,modMyPowerHost,(int)modMyPowerLog);+            sprintf(xln,".%lu\nf:%s\nh:%s\nx:%d\nr:",(unsigned long)lxSeconds,modMyPowerFVEID,modMyPowerHost,(int)modMyPowerLog);
             client.write((byte*)xln,strlen(xln));             client.write((byte*)xln,strlen(xln));
             sprintf(xln,cq,(int)freeRam(),(int)ARDUINO,(int)RAMEND,(int)XRAMEND,             sprintf(xln,cq,(int)freeRam(),(int)ARDUINO,(int)RAMEND,(int)XRAMEND,
             (int)E2END,(int)FLASHEND,(int)SPM_PAGESIZE,(int)E2PAGESIZE);             (int)E2END,(int)FLASHEND,(int)SPM_PAGESIZE,(int)E2PAGESIZE);
             client.write((byte*)xln,strlen(xln));             client.write((byte*)xln,strlen(xln));
-            sprintf(xln,"\nv:%s\nm:%02X%02X%02X%02X%02X%02X\nn:",MPWMicroLogVersion,+            sprintf(xln,"\n\nv:%s\nm:%02X%02X%02X%02X%02X%02X\nn:",MPWMicroLogVersion,
             NETmac[0],NETmac[1],NETmac[2],NETmac[3],NETmac[4],NETmac[5],NETmac[6]);             NETmac[0],NETmac[1],NETmac[2],NETmac[3],NETmac[4],NETmac[5],NETmac[6]);
             client.write((byte*)xln,strlen(xln));                       client.write((byte*)xln,strlen(xln));          
Řádek 900: Řádek 1294:
               client.write((byte*)xln,strlen(xln));                         client.write((byte*)xln,strlen(xln));          
               }               }
-            sprintf(xln,"\nw:%d/%ld",(int)modWebServer,(long)modWebServerPort);+            sprintf(xln,"\nw:%d/%ld\nde:%d",(int)modWebServer,(long)modWebServerPort,(int)modDisplayEmulation); 
 +            client.write((byte*)xln,strlen(xln)); 
 +            client.write("\nds:"); 
 +            for (int i=0;i<16;i++) 
 +              { 
 +              int qb=DPINmap[i]; 
 +              sprintf(xln,"%d",qb); 
 +              if (i<16) strcat(xln,","); 
 +              client.write((byte*)xln,strlen(xln)); 
 +              } 
 +            sprintf(xln,"/%04X/%04X\n",DPINstatus,DPINlogicmask);
             client.write((byte*)xln,strlen(xln));                       client.write((byte*)xln,strlen(xln));          
 +
 +char xstr[30]="";
 +tMpwDateTime xMpwDateTime;
 +GetCurrentDateTime(&xMpwDateTime);
 +FormatDateTimeStr(xstr, "j.n.Y@H:i:s",&xMpwDateTime,sizeof(xstr));
 +
 +
 +            sprintf(xln,"mpw:%s/%d.%d.%d.%ld/%lu/%lu/%lu/%lu/%d/%d/%d/%lu\n",xstr,(int)xMpwAccess.mpwremoteDateYear,
 +              (int)xMpwAccess.mpwremoteDateMonth,
 +              (int)xMpwAccess.mpwremoteDateDay,
 +              (signed long)xMpwAccess.mpwremoteTimeS,
 +              xMpwAccess.mpwremoteCheckedAtS,
 +              xMpwAccess.mpwlogintimeS,
 +              xMpwAccess.mpwDeviceId,
 +              xMpwAccess.mpwAccessId,
 +              (int)xMpwAccess.xComStatus,
 +              (int)xMpwAccess.mpwremoteDateWeek,
 +              (int)xMpwAccess.mpwremoteDateDayOfWeek,
 +              (unsigned long)(lxSeconds-xMpwAccess.mpwremoteCheckedAtS));
 +            client.write((byte*)xln,strlen(xln));          
 +            
             }             }
           else           else
 +// ----------------------------------
 +          if ((qsaction==xACTds) || (qsaction==xACTwds))
 +            {
 +            if (qsaction==xACTwds) client.write("~WDS\n"); else client.write("~DS\n");
 +            for (int xp=0;xp<16;xp++)
 +              {
 +              sprintf(xln,"D%d:%d:",xp,(int)DPINmap[xp]);
 +              client.write((byte*)xln,strlen(xln));
 +              char cname[30]="";
 +              DPIN_epReadConfName(xp,cname,sizeof(cname));
 +              xln[0]=0;
 +              char xf[]="%02X";
 +              char xh[3];
 +              for (int i=0;i<strlen(cname);i++) {
 +                int xi=(uint8_t)cname[i];
 +                sprintf(xh,xf,xi); 
 +                strcat(xln,xh);
 +                }
 +              strcat(xln,"\n");
 +              client.write((byte*)xln,strlen(xln));
 +              }
 +            sprintf(xln,"DX:%04X/%04X\n",DPINstatus,DPINlogicmask);
 +            client.write((byte*)xln,strlen(xln));
 +            }
 +          else
 +// ----------------------------------
           if ((qsaction==xACTas) || (qsaction==xACTwas))           if ((qsaction==xACTas) || (qsaction==xACTwas))
             {             {
-            if (qsaction==xACTwas) +            if (qsaction==xACTwas) client.write("~WAS\n"); else client.write("~AS\n");
-              client.write("~WAS\n"); +
-            else +
-              client.write("~AS\n");+
             for (int xp=0;xp<NUM_ANALOG_INPUTS;xp++)             for (int xp=0;xp<NUM_ANALOG_INPUTS;xp++)
               {               {
Řádek 920: Řádek 1368:
               else               else
                 {                  { 
-                sprintf(xln,"%X/%ld.%d/%ld.%d/",pconf.xopt,pconf.xmin, +                char smin10k[30]="";sprint10k(smin10k,pconf.xmin,pconf.xmin10000); 
-                  pconf.xmin10000,pconf.xmax,pconf.xmax10000);+                char smax10k[30]="";sprint10k(smax10k,pconf.xmax,pconf.xmax10000); 
 +                sprintf(xln,"%X/%s/%s/",pconf.xopt,smin10k,smax10k);
                 client.write((byte*)xln,strlen(xln));                 client.write((byte*)xln,strlen(xln));
                 xln[0]=0;                 xln[0]=0;
Řádek 1066: Řádek 1515:
           else           else
 #endif          #endif         
 +          if (qsaction==xACTep)
 +            {
 +            sprintf(xln,"uLog/%s/eprom.0-%d/@%08lX\n",MPWMicroLogVersion,E2END,millis());
 +            client.write((byte*)xln,strlen(xln));
 +            unsigned long xsum=0;
 +            char s[20]="";
 +            for (int i=0;i<=E2END;i++)
 +              {
 +              if ((i&15)==0) 
 +                {
 +                sprintf(xln,"%04X: ",i);
 +                client.write((byte*)xln,strlen(xln));
 +                }
 +              int v=EEPROM.read(i);
 +              sprintf(xln,"%02X",v);
 +              int xi=i&15;
 +              s[xi]=((v>32)&&(v<127))?v:'.';
 +              s[xi+1]=0;
 +              client.write((byte*)xln,strlen(xln));          
 +              xsum=(((xsum>>24)&0xFF)|(xsum<<8))+v+i;
 +              if ((i&15)==15) 
 +                {
 +                sprintf(xln," %s\n",s);
 +                client.write((byte*)xln,strlen(xln));
 +                s[0]=0;
 +                }
 +              else client.write(" ");
 +              }
 +            if (s[0]!=0)
 +              {
 +              sprintf(xln," %s\n",s);
 +              client.write((byte*)xln,strlen(xln));
 +              s[0]=0;
 +              }
 +            sprintf(xln,"S:%08lX",xsum);
 +            client.write((byte*)xln,strlen(xln));                      
 +            }
 +          else
           if (qmode==xWEBcfg)             if (qmode==xWEBcfg)  
             {             {
Řádek 1079: Řádek 1566:
             client.write("<body>");             client.write("<body>");
             client.write("<b><a href=\"./\">HOME</a> | ");             client.write("<b><a href=\"./\">HOME</a> | ");
-            client.write("<a href=\"mpw\">TOOLS</a></b><hr>");+            client.write("<a href=\"mpw\">TOOLS</a> | "); 
 +            client.write("<a target=\"_blank\" href=\"http://microlog.mypower.cz\">WIKI</a></b><hr>");
             if (qmode==xWEBhome) {             if (qmode==xWEBhome) {
      
Řádek 1109: Řádek 1597:
               client.write("<script language=\"javascript\" src=\"http://");               client.write("<script language=\"javascript\" src=\"http://");
               client.write(modMyPowerHost);               client.write(modMyPowerHost);
-              client.write("/microlog-tools\"></script>");+              client.write("/microlog-tools?"); 
 +              client.write(MPWMicroLogVersion); 
 +              client.write("\"></script>");
               client.write("<div x=\"n\">Connecting to MyPower.CZ ...</div>");               client.write("<div x=\"n\">Connecting to MyPower.CZ ...</div>");
               }               }
Řádek 1406: Řádek 1896:
         xvar->xval=0;         xvar->xval=0;
         xvar->xval10000=0;         xvar->xval10000=0;
-        DisplayFillVarByPinValue(xpin,xvar,r);+         
 +        if ( (xvar->xname[0]=='@') && (xvar->xname[1]=='T') ) 
 +          DisplayFillVarByTimeVar(xvar); 
 +        else 
 +          DisplayFillVarByPinValue(xpin,xvar,r); 
 +        
         }         }
       else       else
Řádek 1524: Řádek 2019:
 tDispVar xvar; tDispVar xvar;
 DisplayFillVarByPinValue(xpin,&xvar,xpintype); DisplayFillVarByPinValue(xpin,&xvar,xpintype);
-signed long xval=xvar.xval; +//signed long xval=xvar.xval; 
-int xval10k=xvar.xval10000; +//int xval10k=xvar.xval10000; 
-sprintf(xret,"%ld.%04d",xval,xval10k);+sprint10k(xret,xvar.xval,xvar.xval10000); //minus bugfix 
 +//sprintf(xret,"%ld.%04d",xval,xval10k);
 } }
  
Řádek 1587: Řádek 2083:
     {     {
     if (c=='.') { c=xsrc[i+1];     if (c=='.') { c=xsrc[i+1];
 +      if (c=='R') { xdecs=0xFE; i++; }  else
       if ((c>='0') && (c<='9')) { xdecs=c-'0';i++; }       if ((c>='0') && (c<='9')) { xdecs=c-'0';i++; }
       c='#';  }       c='#';  }
Řádek 1623: Řádek 2120:
         {         {
         char pxval[50]="";         char pxval[50]="";
-        char qsc[]=" kMGT"; +        if ( (xvar->xname[0]=='@') && (xvar->xname[1]=='T')
-        char *xsc=qsc; +
-        signed long xval=xvar->xval; +
-        int xval10k=xvar->xval10000; +
-        while (xval>1500)+
           {           {
-          if (xsc[1]==0) break; +          DisplayGetValueByTimeVar(pxval,xvar->xname,sizeof(pxval)); 
-          int64 xq,xr; word xmod; +          } 
-          i64x10k2int10k(&xq, xval,xval10k); +        else 
-          i64divW(&xr, &xmod, &xq, 1000); +          { 
-          i64int10k2x10k(&xval,&xval10k,&xr); +          char qsc[]=" kMGT"; 
-          xsc++;+          char *xsc=qsc; 
 +          signed long xval=xvar->xval; 
 +          int xval10k=xvar->xval10000; 
 + 
 +          if (xdecs==0xFE) 
 +            { 
 +            sprintf(pxval,"%ld",xval); 
 +            } 
 +          else 
 +            { 
 +            while (xval>1500) 
 +              { 
 +              if (xsc[1]==0) break; 
 +              int64 xq,xr; word xmod; 
 +              i64x10k2int10k(&xq, xval,xval10k); 
 +              i64divW(&xr, &xmod, &xq, 1000); 
 +              i64int10k2x10k(&xval,&xval10k,&xr); 
 +              xsc++; 
 +              } 
 +            sprint10k(pxval,xval,xval10k); // minus bugfix 
 +    //        sprintf(pxval,"%ld.%04d",xval,xval10k); 
 +            DisplayCorrectDecs(pxval,xdecs); 
 +            if ((xsc[0]!=' ') && (xsc[0]!=0)) { xsc[1]=0; strcat(pxval,xsc);
 +            }
           }           }
-        sprintf(pxval,"%ld.%04d",xval,xval10k); 
-        DisplayCorrectDecs(pxval,xdecs); 
-        if ((xsc[0]!=' ') && (xsc[0]!=0)) { xsc[1]=0; strcat(pxval,xsc); } 
         for (int cc=0;cc<strlen(pxval);cc++)         for (int cc=0;cc<strlen(pxval);cc++)
           if (ix<xmaxlen-1) { xdst[ix]=pxval[cc];ix++;xdst[ix]=0; }           if (ix<xmaxlen-1) { xdst[ix]=pxval[cc];ix++;xdst[ix]=0; }
Řádek 1653: Řádek 2166:
   hasvar=(c=='$');   hasvar=(c=='$');
   if ((!hasvar) && (ix<xmaxlen-1)) { xdst[ix]=c;ix++;xdst[ix]=0; }   if ((!hasvar) && (ix<xmaxlen-1)) { xdst[ix]=c;ix++;xdst[ix]=0; }
 +  }
 +}
 +
 +
 +void DisplayFillVarByTimeVar(struct tDispVar * xvar)
 +{
 +char px[30]="";
 +DisplayGetValueByTimeVar(px,xvar->xname,sizeof(px));
 +xvar->xval=atol(px);
 +xvar->xval10000=0;
 +}
 +
 +
 +void DisplayGetValueByTimeVar(char * xbuf,char * xvarname,int xbufmaxsize)
 +{
 +xbuf[0]=0;
 +if ((xvarname[0]=='@') && (xvarname[1]=='T'))
 +  {
 +  if (strlen(xvarname)>=3)
 +    {
 +char xfmt[5]="";xfmt[0]=xvarname[2];xfmt[1]=0;
 +tMpwDateTime xMpwDateTime;GetCurrentDateTime(&xMpwDateTime);
 +FormatDateTimeStr(xbuf,xfmt,&xMpwDateTime,xbufmaxsize);
 +    }
   }   }
 } }
Řádek 1700: Řádek 2237:
 return SamplerAnalogReadType(xpin,xpinOPTdefault);  return SamplerAnalogReadType(xpin,xpinOPTdefault); 
 } }
 +
 +
 +void SamplerReset() { 
 +  for (int i=0;i<NUM_ANALOG_INPUTS;i++) 
 +    xSamplerStruct.tPinValues[i].smpTime=0; 
 +  }
  
 int SamplerAnalogReadType(byte xpin,byte forcextype) int SamplerAnalogReadType(byte xpin,byte forcextype)
Řádek 1903: Řádek 2446:
     xpinvalue->smpMin=qSampledPin->smpMin;     xpinvalue->smpMin=qSampledPin->smpMin;
     xpinvalue->smpMax=qSampledPin->smpMax;     xpinvalue->smpMax=qSampledPin->smpMax;
 +    xpinvalue->smpTime=millis();
     }     }
   }   }
Řádek 1910: Řádek 2454:
  
  
 +// -- [MATH10k] -------------------------------------------------
 +
 +boolean isnegative10k(signed long xval, int x10k) { 
 +  boolean xret=(xval<0);if (xval==0) xret=(x10k<0);return xret; 
 +}
 +
 +void sprint10k(char * xret, signed long xval, int x10k) {
 +char xsgn[5]="";if (isnegative10k(xval,x10k)) strcpy(xsgn,"-");
 +if (xval<0) xval=-xval; if (x10k<0) x10k=-x10k;
 +sprintf(xret,"%s%ld.%04d",xsgn,xval,x10k);
 +}
  
 // -- [MATH64] ------------------------------------------------- // -- [MATH64] -------------------------------------------------
Řádek 1991: Řádek 2546:
 word xmod=0;i64divW(&qret, &xmod, xint64, 10000);*x10k=xmod; word xmod=0;i64divW(&qret, &xmod, xint64, 10000);*x10k=xmod;
 signed long qval=(((unsigned long)qret.lh)<<16)+(unsigned long)qret.ll; signed long qval=(((unsigned long)qret.lh)<<16)+(unsigned long)qret.ll;
-*xval=msf?(-qval):qval;xint64->msf=msf;+*xval=msf?(-qval):qval; if (msf) *x10k=-(*x10k); // minus bugfix 
 +xint64->msf=msf;
 } }
  
 void i64x10k2int10k(struct int64 * xret, signed long xval, int x10k) { void i64x10k2int10k(struct int64 * xret, signed long xval, int x10k) {
 int64 q1;int64 q2;i64nul(xret);i64nul(&q1);i64nul(&q2); int64 q1;int64 q2;i64nul(xret);i64nul(&q1);i64nul(&q2);
-boolean msf=((xval)<0);if (msf) xval=-(xval);if (x10k<0) x10k=-(x10k);+/* boolean msf=((xval)<0); */ boolean msf=isnegative10k(xval,x10k); // minus bugfix 
 +if (msf) xval=-(xval);if (x10k<0) x10k=-(x10k);
 q2.ll=(x10k)&0xFFFF;i64mul(&q1, (unsigned long)(xval), 10000UL); q2.ll=(x10k)&0xFFFF;i64mul(&q1, (unsigned long)(xval), 10000UL);
 i64addS(xret, &q1, &q2);xret->msf=msf; i64addS(xret, &q1, &q2);xret->msf=msf;
Řádek 2003: Řádek 2560:
 void i64x10k2int10kH(struct int64 * xret, signed long xval, int x10k) { void i64x10k2int10kH(struct int64 * xret, signed long xval, int x10k) {
 int64 q1;int64 q2;i64nul(xret);i64nul(&q1);i64nul(&q2); int64 q1;int64 q2;i64nul(xret);i64nul(&q1);i64nul(&q2);
-boolean msf=((xval)<0);if (msf) xval=-(xval);if (x10k<0) x10k=-(x10k);+/* boolean msf=((xval)<0); */ boolean msf=isnegative10k(xval,x10k); // minus bugfix 
 +if (msf) xval=-(xval);if (x10k<0) x10k=-(x10k);
 q2.ll=(x10k/100)&0xFFFF;i64mul(&q1, (unsigned long)(xval), 100UL); q2.ll=(x10k/100)&0xFFFF;i64mul(&q1, (unsigned long)(xval), 100UL);
 i64addS(xret, &q1, &q2);xret->msf=msf; i64addS(xret, &q1, &q2);xret->msf=msf;
 } }
 +
 +
 +// ---[ Digital Pin Output ]----------------------------------------
 +
 +int DPIN_epGetConfNameAddr(byte xpinindex) { 
 +return (xpinindex<16)?(2048+(xpinindex*20)):-1;
 +}
 +
 +void DPIN_epWriteConfName(byte xpinindex,char * xnamebuf ) {
 +int xaddr=DPIN_epGetConfNameAddr(xpinindex);
 +if (xaddr>0) 
 +  {
 +  byte chsum=(xaddr&0xFF)+xpinindex;
 +  for (int i=1;i<20;i++) {
 +    byte ch=xnamebuf[i-1]; 
 +    chsum+=ch+i+(ch&(0x0F<<2));
 +    if (EEPROM.read(xaddr+i)!=ch) EEPROM.write(xaddr+i,ch);    
 +    if (ch==0) break;
 +    }
 +  if (EEPROM.read(xaddr)!=chsum) EEPROM.write(xaddr,chsum);    
 +  }
 +}
 +
 +void DPIN_epReadConfName(byte xpinindex,char * xnamebuf, int xbufsize ) {
 +char xbuf[20]="";
 +int xaddr=DPIN_epGetConfNameAddr(xpinindex);
 +byte chsum=(xaddr&0xFF)+xpinindex;
 +if (xaddr>0) 
 +  {
 +  for (int i=1;i<20;i++) {
 +    byte ch=EEPROM.read(xaddr+i);
 +    chsum+=ch+i+(ch&(0x0F<<2));
 +    if (ch==0) break;
 +    xbuf[i-1]=ch;
 +    xbuf[i]=0;
 +    }
 +  if (EEPROM.read(xaddr)==chsum)
 +    {
 +    strncpy(xnamebuf,xbuf,xbufsize-1);
 +    xnamebuf[xbufsize-1]=0;
 +    }
 +  else
 +    xnamebuf[0]=0;
 +  }
 +}
 +
 +void DPINUpdateHW() {
 +uint16_t dstat=DPINstatus^DPINlogicmask;
 +for (int i=0;i<16;i++) { byte xdpin=DPINmap[i];
 +  if ((xdpin>=22) && (xdpin<=49)) digitalWrite(xdpin, ((dstat&(1<<i))==0)?LOW:HIGH);
 +  }
 +}
 +
 +void DPINResetHW() {
 +for (int i=0;i<16;i++) { byte xdpin=DPINmap[i];
 +  if ((xdpin>=22) && (xdpin<=49)) { pinMode(xdpin, OUTPUT); digitalWrite(xdpin, LOW); }
 +  }
 +DPINUpdateHW();
 +}
 +
  
  
 </file> </file>
source.1377324090.txt.gz · Poslední úprava: 2013/08/24 14:01 (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki