Compare commits
	
		
			6 Commits
		
	
	
		
			080742c88c
			...
			d78c73d61f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d78c73d61f | |||
| 812a094e50 | |||
| 2ada3d9a61 | |||
| 6ffe239cae | |||
| bd4c1d9d53 | |||
| 808709f5c2 | 
@@ -75,13 +75,25 @@
 | 
				
			|||||||
          <table class="table">
 | 
					          <table class="table">
 | 
				
			||||||
            <tbody>
 | 
					            <tbody>
 | 
				
			||||||
              <tr>
 | 
					              <tr>
 | 
				
			||||||
                <th class="col-md-4" scope="col">Timestamp</th>
 | 
					                <th class="col-md-3" scope="col">Zeitstempel</th>
 | 
				
			||||||
                <th class="col-md-4" scope="col">DTC</th>
 | 
					                <th class="col-md-3" scope="col">Fehlercode</th>
 | 
				
			||||||
                <th class="col-md-4" scope="col">active</th>
 | 
					                <th class="col-md-3" scope="col">Schwere</th>
 | 
				
			||||||
 | 
					                <th class="col-md-3" scope="col">Aktiv</th>
 | 
				
			||||||
              </tr>
 | 
					              </tr>
 | 
				
			||||||
              %DTC_TABLE%
 | 
					              %DTC_TABLE%
 | 
				
			||||||
            </tbody>
 | 
					            </tbody>
 | 
				
			||||||
          </table>
 | 
					          </table>
 | 
				
			||||||
 | 
					          <p>
 | 
				
			||||||
 | 
					            <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#collapseDTCDescription"
 | 
				
			||||||
 | 
					              aria-expanded="false" aria-controls="collapseDTCDescription">
 | 
				
			||||||
 | 
					              DTC Beschreibung
 | 
				
			||||||
 | 
					            </button>
 | 
				
			||||||
 | 
					          </p>
 | 
				
			||||||
 | 
					          <div class="collapse" id="collapseDTCDescription">
 | 
				
			||||||
 | 
					            <div class="card card-body">
 | 
				
			||||||
 | 
					              <embed type="text/html" src="static/dtc.txt" width="100%">
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        </p>
 | 
					        </p>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
@@ -252,24 +264,7 @@
 | 
				
			|||||||
        <h3>Wartung</h3>
 | 
					        <h3>Wartung</h3>
 | 
				
			||||||
        <hr>
 | 
					        <hr>
 | 
				
			||||||
        <p>
 | 
					        <p>
 | 
				
			||||||
        <form action="\post.htm" method="POST" class="form-horizontal">
 | 
					        <h4>Ölvorrat</h4>
 | 
				
			||||||
          <div class="form-group">
 | 
					 | 
				
			||||||
            <label for="purgepulse" class="control-label col-xs-5">Entlüftung Impulse</label>
 | 
					 | 
				
			||||||
            <div class="col-xs-7">
 | 
					 | 
				
			||||||
              <div class="input-group">
 | 
					 | 
				
			||||||
                <input id="purgepulse" name="purgepulse" value="%BLEEDING_PULSES%" type="text" class="form-control">
 | 
					 | 
				
			||||||
                <div class="input-group-addon"></div>
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
          </div>
 | 
					 | 
				
			||||||
          <div class="form-group row">
 | 
					 | 
				
			||||||
            <div class="col-xs-offset-5 col-xs-7">
 | 
					 | 
				
			||||||
              <button name="maintsave" type="submit" class="btn btn-primary">Speichern</button>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
          </div>
 | 
					 | 
				
			||||||
        </form>
 | 
					 | 
				
			||||||
        </p>
 | 
					 | 
				
			||||||
        <p>
 | 
					 | 
				
			||||||
        <form action="\post.htm" method="POST" class="form-horizontal">
 | 
					        <form action="\post.htm" method="POST" class="form-horizontal">
 | 
				
			||||||
          <div class="form-group">
 | 
					          <div class="form-group">
 | 
				
			||||||
            <label for="tankremain_maint" class="control-label col-xs-5">Tankinhalt verbleibend</label>
 | 
					            <label for="tankremain_maint" class="control-label col-xs-5">Tankinhalt verbleibend</label>
 | 
				
			||||||
@@ -290,6 +285,53 @@
 | 
				
			|||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
        </p>
 | 
					        </p>
 | 
				
			||||||
 | 
					        <hr>
 | 
				
			||||||
 | 
					        <p>
 | 
				
			||||||
 | 
					        <h4>Entlüftung</h4>
 | 
				
			||||||
 | 
					        <form action="\post.htm" method="POST" class="form-horizontal">
 | 
				
			||||||
 | 
					          <div class="form-group">
 | 
				
			||||||
 | 
					            <label for="purgepulse" class="control-label col-xs-5">Entlüftung Dosierung</label>
 | 
				
			||||||
 | 
					            <div class="col-xs-7">
 | 
				
			||||||
 | 
					              <div class="input-group">
 | 
				
			||||||
 | 
					                <input id="purgepulse" name="purgepulse" value="%BLEEDING_PULSES%" type="text" class="form-control">
 | 
				
			||||||
 | 
					                <div class="input-group-addon">Pulse</div>
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					          <div class="form-group row">
 | 
				
			||||||
 | 
					            <div class="col-xs-offset-5 col-xs-7">
 | 
				
			||||||
 | 
					              <button name="maintsave" type="submit" class="btn btn-primary">Speichern</button>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </form>
 | 
				
			||||||
 | 
					        </p>
 | 
				
			||||||
 | 
					        <hr>
 | 
				
			||||||
 | 
					        <h4>EEPROM</h4>
 | 
				
			||||||
 | 
					        <p>
 | 
				
			||||||
 | 
					        <form action="\post.htm" method="POST" class="form-horizontal">
 | 
				
			||||||
 | 
					          <div class="form-group">
 | 
				
			||||||
 | 
					            <div class="col-xs-offset-5 col-xs-7">
 | 
				
			||||||
 | 
					              <div class="form-check">
 | 
				
			||||||
 | 
					                <input class="form-check-input" type="checkbox" value="" id="reset_ee_cfg_check">
 | 
				
			||||||
 | 
					                <label class="form-check-label" for="reset_ee_cfg_check">
 | 
				
			||||||
 | 
					                  JA, EEPROM-Bereich "CFG" formatieren und Konfiguration zurück setzen
 | 
				
			||||||
 | 
					                </label>
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
 | 
					              <div class="form-check">
 | 
				
			||||||
 | 
					                <input class="form-check-input" type="checkbox" value="" id="reset_ee_pds_check">
 | 
				
			||||||
 | 
					                <label class="form-check-label" for="reset_ee_pds_check">
 | 
				
			||||||
 | 
					                  JA, EEPROM-Bereich "PDS" formatieren und Betriebsdaten zurück setzen
 | 
				
			||||||
 | 
					                </label>
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					          <div class="form-group row">
 | 
				
			||||||
 | 
					            <div class="col-xs-offset-5 col-xs-7">
 | 
				
			||||||
 | 
					              <button name="reset_ee_btn" type="submit" class="btn btn-primary">EEPROM formatieren</button>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </form>
 | 
				
			||||||
 | 
					        </p>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <!-- Div Tab Maintenance -->
 | 
					      <!-- Div Tab Maintenance -->
 | 
				
			||||||
      <!-- Div Tank Settings-->
 | 
					      <!-- Div Tank Settings-->
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								Software/data/static/dtc.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Software/data/static/dtc.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					1 - TANK_EMPTY
 | 
				
			||||||
 | 
					2 - DTC_TANK_LOW
 | 
				
			||||||
 | 
					3 - DTC_NO_EEPROM_FOUND
 | 
				
			||||||
 | 
					4 - DTC_EEPROM_CFG_BAD
 | 
				
			||||||
 | 
					5 - DTC_EEPROM_PDS_BAD
 | 
				
			||||||
 | 
					6 - DTC_EEPROM_PDSADRESS_BAD
 | 
				
			||||||
 | 
					7 - DTC_EEPROM_VERSION_BAD
 | 
				
			||||||
 | 
					8 - DTC_FLASHFS_ERROR
 | 
				
			||||||
 | 
					9 - DTC_FLASHFS_VERSION_ERROR
 | 
				
			||||||
 | 
					10 - DTC_NO_GPS_SERIAL
 | 
				
			||||||
 | 
					11 - DTC_CAN_TRANSCEIVER_FAILED
 | 
				
			||||||
 | 
					12 - DTC_NO_CAN_SIGNAL
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Software/data/static/img/critical.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Software/data/static/img/critical.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 7.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Software/data/static/img/info.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Software/data/static/img/info.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 9.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Software/data/static/img/warn.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Software/data/static/img/warn.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 9.4 KiB  | 
@@ -7,7 +7,7 @@ void Init_CAN()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) != CAN_OK)
 | 
					    if (CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) != CAN_OK)
 | 
				
			||||||
        MaintainDTC(DTC_CAN_TRANSCEIVER_FAILED, true);
 | 
					        MaintainDTC(DTC_CAN_TRANSCEIVER_FAILED, DTC_CRITICAL, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CAN0.init_Mask(0, 0, 0x07FF0000); // Init first mask...
 | 
					    CAN0.init_Mask(0, 0, 0x07FF0000); // Init first mask...
 | 
				
			||||||
    CAN0.init_Mask(1, 0, 0x07FF0000); // Init second mask...
 | 
					    CAN0.init_Mask(1, 0, 0x07FF0000); // Init second mask...
 | 
				
			||||||
@@ -39,7 +39,7 @@ uint32_t Process_CAN_WheelSpeed()
 | 
				
			|||||||
        return milimeters_to_add;
 | 
					        return milimeters_to_add;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MaintainDTC(DTC_NO_CAN_SIGNAL, (millis() > lastRecTimestamp + 10000 ? true : false));
 | 
					    MaintainDTC(DTC_NO_CAN_SIGNAL, DTC_CRITICAL, (millis() > lastRecTimestamp + 10000 ? true : false));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,8 @@
 | 
				
			|||||||
#define SW_VERSION_MAJOR 1
 | 
					#define SW_VERSION_MAJOR 1
 | 
				
			||||||
#define SW_VERSION_MINOR 1
 | 
					#define SW_VERSION_MINOR 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FLASH_FS_VERSION 1.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OTA_DELAY
 | 
					#ifndef OTA_DELAY
 | 
				
			||||||
#define OTA_DELAY 50 // ticks -> 10ms / tick
 | 
					#define OTA_DELAY 50 // ticks -> 10ms / tick
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,15 +19,6 @@ void InitEEPROM()
 | 
				
			|||||||
  {
 | 
					  {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  GetConfig_EEPROM();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (LubeConfig.EEPROM_Version != eeVersion)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    FormatConfig_EEPROM();
 | 
					 | 
				
			||||||
    globals.systemStatus = sysStat_Error;
 | 
					 | 
				
			||||||
    MaintainDTC(DTC_EEPROM_VERSION_BAD, true);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void EEPROM_Process()
 | 
					void EEPROM_Process()
 | 
				
			||||||
@@ -84,7 +75,7 @@ void GetConfig_EEPROM()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)) != checksum)
 | 
					  if (Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)) != checksum)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    MaintainDTC(DTC_EEPROM_CFG_BAD, true);
 | 
					    MaintainDTC(DTC_EEPROM_CFG_BAD, DTC_CRITICAL, true);
 | 
				
			||||||
    FormatConfig_EEPROM();
 | 
					    FormatConfig_EEPROM();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  LubeConfig.checksum = checksum;
 | 
					  LubeConfig.checksum = checksum;
 | 
				
			||||||
@@ -118,7 +109,7 @@ void GetPersistence_EEPROM()
 | 
				
			|||||||
  {
 | 
					  {
 | 
				
			||||||
    MovePersistencePage_EEPROM(true);
 | 
					    MovePersistencePage_EEPROM(true);
 | 
				
			||||||
    FormatPersistence_EEPROM();
 | 
					    FormatPersistence_EEPROM();
 | 
				
			||||||
    MaintainDTC(DTC_EEPROM_PDSADRESS_BAD, true);
 | 
					    MaintainDTC(DTC_EEPROM_PDSADRESS_BAD, DTC_CRITICAL, true);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -129,7 +120,7 @@ void GetPersistence_EEPROM()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) != checksum)
 | 
					    if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) != checksum)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      MaintainDTC(DTC_EEPROM_PDS_BAD, true);
 | 
					      MaintainDTC(DTC_EEPROM_PDS_BAD, DTC_CRITICAL, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    PersistenceData.checksum = checksum;
 | 
					    PersistenceData.checksum = checksum;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -224,10 +215,10 @@ boolean checkEEPROMavailable()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  if (!ee.isConnected())
 | 
					  if (!ee.isConnected())
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    MaintainDTC(DTC_NO_EEPROM_FOUND, true);
 | 
					    MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, true);
 | 
				
			||||||
    globals.systemStatus = sysStat_Error;
 | 
					    globals.systemStatus = sysStat_Error;
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  MaintainDTC(DTC_NO_EEPROM_FOUND, false);
 | 
					  MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, false);
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
DTCEntry_s DTCStorage[MAX_DTC_STORAGE];
 | 
					DTCEntry_s DTCStorage[MAX_DTC_STORAGE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MaintainDTC(DTCNums_t DTC_no, boolean active)
 | 
					void MaintainDTC(DTCNums_t DTC_no, DTCSeverity_t DTC_severity, boolean active)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    for (int i = 0; i < MAX_DTC_STORAGE; i++)
 | 
					    for (int i = 0; i < MAX_DTC_STORAGE; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -13,6 +13,7 @@ void MaintainDTC(DTCNums_t DTC_no, boolean active)
 | 
				
			|||||||
                Serial.printf("DTC gone active: %d\n", DTC_no);
 | 
					                Serial.printf("DTC gone active: %d\n", DTC_no);
 | 
				
			||||||
                DTCStorage[i].timestamp = millis();
 | 
					                DTCStorage[i].timestamp = millis();
 | 
				
			||||||
                DTCStorage[i].active = DTC_ACTIVE;
 | 
					                DTCStorage[i].active = DTC_ACTIVE;
 | 
				
			||||||
 | 
					                DTCStorage[i].severity = DTC_severity;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (!active && DTCStorage[i].active == DTC_ACTIVE)
 | 
					            if (!active && DTCStorage[i].active == DTC_ACTIVE)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -83,3 +84,23 @@ DTCNums_t getlastDTC(boolean only_active)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return pointer >= 0 ? DTCStorage[pointer].Number : DTC_LAST_DTC;
 | 
					    return pointer >= 0 ? DTCStorage[pointer].Number : DTC_LAST_DTC;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DTCNums_t getlastDTC_Severity(boolean only_active, DTCSeverity_t severity)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int8_t pointer = -1;
 | 
				
			||||||
 | 
					    uint32_t lasttimestamp = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i = 0; i < MAX_DTC_STORAGE; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (DTCStorage[i].Number > 0 && DTCStorage[i].timestamp > lasttimestamp)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if ((only_active == false || DTCStorage[i].active == DTC_ACTIVE) && DTCStorage[i].severity == severity)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                pointer = i;
 | 
				
			||||||
 | 
					                lasttimestamp = DTCStorage[i].timestamp;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return pointer >= 0 ? DTCStorage[pointer].Number : DTC_LAST_DTC;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -8,12 +8,14 @@
 | 
				
			|||||||
typedef enum DTCNums_e
 | 
					typedef enum DTCNums_e
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  DTC_TANK_EMPTY = 1,
 | 
					  DTC_TANK_EMPTY = 1,
 | 
				
			||||||
 | 
					  DTC_TANK_LOW,
 | 
				
			||||||
  DTC_NO_EEPROM_FOUND,
 | 
					  DTC_NO_EEPROM_FOUND,
 | 
				
			||||||
  DTC_EEPROM_CFG_BAD,
 | 
					  DTC_EEPROM_CFG_BAD,
 | 
				
			||||||
  DTC_EEPROM_PDS_BAD,
 | 
					  DTC_EEPROM_PDS_BAD,
 | 
				
			||||||
  DTC_EEPROM_PDSADRESS_BAD,
 | 
					  DTC_EEPROM_PDSADRESS_BAD,
 | 
				
			||||||
  DTC_EEPROM_VERSION_BAD,
 | 
					  DTC_EEPROM_VERSION_BAD,
 | 
				
			||||||
  DTC_FLASHFS_ERROR,
 | 
					  DTC_FLASHFS_ERROR,
 | 
				
			||||||
 | 
					  DTC_FLASHFS_VERSION_ERROR,
 | 
				
			||||||
#ifdef FEATURE_ENABLE_GPS
 | 
					#ifdef FEATURE_ENABLE_GPS
 | 
				
			||||||
  DTC_NO_GPS_SERIAL,
 | 
					  DTC_NO_GPS_SERIAL,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -31,17 +33,26 @@ typedef enum DTCActive_e
 | 
				
			|||||||
  DTC_PREVIOUS
 | 
					  DTC_PREVIOUS
 | 
				
			||||||
} DTCActive_t;
 | 
					} DTCActive_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum DTCSeverity_e
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  DTC_INFO,
 | 
				
			||||||
 | 
					  DTC_WARN,
 | 
				
			||||||
 | 
					  DTC_CRITICAL
 | 
				
			||||||
 | 
					} DTCSeverity_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct DTCEntry_s
 | 
					typedef struct DTCEntry_s
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  DTCNums_t Number;
 | 
					  DTCNums_t Number;
 | 
				
			||||||
  uint32_t timestamp;
 | 
					  uint32_t timestamp;
 | 
				
			||||||
  DTCActive_t active;
 | 
					  DTCActive_t active;
 | 
				
			||||||
 | 
					  DTCSeverity_t severity;
 | 
				
			||||||
} DTCEntry_t;
 | 
					} DTCEntry_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MaintainDTC(DTCNums_t DTC_no, boolean active);
 | 
					void MaintainDTC(DTCNums_t DTC_no, DTCSeverity_t DTC_severity, boolean active);
 | 
				
			||||||
void ClearDTC(DTCNums_t DTC_no);
 | 
					void ClearDTC(DTCNums_t DTC_no);
 | 
				
			||||||
void ClearAllDTC();
 | 
					void ClearAllDTC();
 | 
				
			||||||
DTCNums_t getlastDTC(boolean only_active);
 | 
					DTCNums_t getlastDTC(boolean only_active);
 | 
				
			||||||
 | 
					DTCNums_t getlastDTC_Severity(boolean only_active, DTCSeverity_t severity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern DTCEntry_s DTCStorage[MAX_DTC_STORAGE];
 | 
					extern DTCEntry_s DTCStorage[MAX_DTC_STORAGE];
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -18,9 +18,12 @@ typedef enum eEERequest
 | 
				
			|||||||
  EE_IDLE,
 | 
					  EE_IDLE,
 | 
				
			||||||
  EE_CFG_SAVE,
 | 
					  EE_CFG_SAVE,
 | 
				
			||||||
  EE_CFG_LOAD,
 | 
					  EE_CFG_LOAD,
 | 
				
			||||||
 | 
					  EE_CFG_FORMAT,
 | 
				
			||||||
  EE_PDS_SAVE,
 | 
					  EE_PDS_SAVE,
 | 
				
			||||||
  EE_PDS_LOAD,
 | 
					  EE_PDS_LOAD,
 | 
				
			||||||
 | 
					  EE_PDS_FORMAT,
 | 
				
			||||||
  EE_ALL_SAVE
 | 
					  EE_ALL_SAVE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} tEERequest;
 | 
					} tEERequest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct Globals_s
 | 
					typedef struct Globals_s
 | 
				
			||||||
@@ -31,8 +34,10 @@ typedef struct Globals_s
 | 
				
			|||||||
  uint16_t purgePulses = 0;
 | 
					  uint16_t purgePulses = 0;
 | 
				
			||||||
  eEERequest requestEEAction = EE_IDLE;
 | 
					  eEERequest requestEEAction = EE_IDLE;
 | 
				
			||||||
  char DeviceName[33];
 | 
					  char DeviceName[33];
 | 
				
			||||||
  uint32_t FlashVersion;
 | 
					  char FlashVersion[5];
 | 
				
			||||||
  uint16_t eePersistanceAdress;
 | 
					  uint16_t eePersistanceAdress;
 | 
				
			||||||
 | 
					  uint8_t TankPercentage;
 | 
				
			||||||
 | 
					  bool hasDTC;
 | 
				
			||||||
} Globals_t;
 | 
					} Globals_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern Globals_t globals;
 | 
					extern Globals_t globals;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ uint32_t Process_GPS_WheelSpeed()
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MaintainDTC(DTC_NO_GPS_SERIAL, (millis() > lastRecTimestamp + 10000));
 | 
					    MaintainDTC(DTC_NO_GPS_SERIAL,DTC_CRITICAL, (millis() > lastRecTimestamp + 10000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,15 +5,22 @@ uint32_t lubePulseTimestamp = 0;
 | 
				
			|||||||
void RunLubeApp(uint32_t add_milimeters)
 | 
					void RunLubeApp(uint32_t add_milimeters)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MaintainDTC(DTC_TANK_EMPTY, (PersistenceData.tankRemain_µl < LubeConfig.amountPerDose_µl));
 | 
					    globals.TankPercentage = PersistenceData.tankRemain_µl / (LubeConfig.tankCapacity_ml * 1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MaintainDTC(DTC_TANK_EMPTY, DTC_CRITICAL, (PersistenceData.tankRemain_µl < LubeConfig.amountPerDose_µl));
 | 
				
			||||||
 | 
					    MaintainDTC(DTC_TANK_LOW, DTC_WARN, (globals.TankPercentage < LubeConfig.TankRemindAtPercentage));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static tSystem_Status preserverSysStatusError;
 | 
					    static tSystem_Status preserverSysStatusError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (globals.systemStatus != sysStat_Error)
 | 
					    if (getlastDTC(false) < DTC_LAST_DTC)
 | 
				
			||||||
        preserverSysStatusError = globals.systemStatus;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (getlastDTC(true) < DTC_LAST_DTC)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        globals.hasDTC = true;
 | 
				
			||||||
 | 
					        if (getlastDTC_Severity(true, DTC_CRITICAL) < DTC_LAST_DTC)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (globals.systemStatus != sysStat_Error)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                preserverSysStatusError = globals.systemStatus;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            globals.systemStatus = sysStat_Error;
 | 
					            globals.systemStatus = sysStat_Error;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
@@ -23,6 +30,11 @@ void RunLubeApp(uint32_t add_milimeters)
 | 
				
			|||||||
                globals.systemStatus = preserverSysStatusError;
 | 
					                globals.systemStatus = preserverSysStatusError;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        globals.hasDTC = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Add traveled Distance in mm
 | 
					    // Add traveled Distance in mm
 | 
				
			||||||
    PersistenceData.TravelDistance_highRes_mm += add_milimeters;
 | 
					    PersistenceData.TravelDistance_highRes_mm += add_milimeters;
 | 
				
			||||||
@@ -108,10 +120,14 @@ void RunLubeApp(uint32_t add_milimeters)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LubePulse()
 | 
					void LubePulse()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (PersistenceData.tankRemain_µl > 0) // Only Lube if theres Oil remaining!
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        lubePulseTimestamp = millis() + LUBE_PULSE_LENGHT_MS;
 | 
					        lubePulseTimestamp = millis() + LUBE_PULSE_LENGHT_MS;
 | 
				
			||||||
    if (PersistenceData.tankRemain_µl < LubeConfig.amountPerDose_µl)
 | 
					
 | 
				
			||||||
 | 
					        if (PersistenceData.tankRemain_µl < LubeConfig.amountPerDose_µl) // Prevent underrun and shiftover
 | 
				
			||||||
            PersistenceData.tankRemain_µl = 0;
 | 
					            PersistenceData.tankRemain_µl = 0;
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            PersistenceData.tankRemain_µl = PersistenceData.tankRemain_µl - LubeConfig.amountPerDose_µl;
 | 
					            PersistenceData.tankRemain_µl = PersistenceData.tankRemain_µl - LubeConfig.amountPerDose_µl;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -11,6 +11,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "common.h"
 | 
					#include "common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "sanitycheck.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "lubeapp.h"
 | 
					#include "lubeapp.h"
 | 
				
			||||||
#include "webui.h"
 | 
					#include "webui.h"
 | 
				
			||||||
#include "config.h"
 | 
					#include "config.h"
 | 
				
			||||||
@@ -94,7 +96,7 @@ void setup()
 | 
				
			|||||||
#ifdef FEATURE_ENABLE_WIFI_CLIENT
 | 
					#ifdef FEATURE_ENABLE_WIFI_CLIENT
 | 
				
			||||||
  WiFi.mode(WIFI_STA);
 | 
					  WiFi.mode(WIFI_STA);
 | 
				
			||||||
  WiFi.setHostname(globals.DeviceName);
 | 
					  WiFi.setHostname(globals.DeviceName);
 | 
				
			||||||
  wifiMulti.addAP(QUOTE(WIFI_SSID), QUOTE(WIFI_PASSWORD));
 | 
					  wifiMulti.addAP(QUOTE(WIFI_SSID_CLIENT), QUOTE(WIFI_PASSWORD_CLIENT));
 | 
				
			||||||
  WiFiMaintainConnectionTicker.start();
 | 
					  WiFiMaintainConnectionTicker.start();
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  WiFi.mode(WIFI_OFF);
 | 
					  WiFi.mode(WIFI_OFF);
 | 
				
			||||||
@@ -504,14 +506,12 @@ void LED_Process(uint8_t override, CRGB SetColor)
 | 
				
			|||||||
    oldSysStatus = globals.systemStatus;
 | 
					    oldSysStatus = globals.systemStatus;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint32_t percentage = PersistenceData.tankRemain_µl / (LubeConfig.tankCapacity_ml * 1000);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  switch (LED_Status)
 | 
					  switch (LED_Status)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
  case LED_Startup:
 | 
					  case LED_Startup:
 | 
				
			||||||
    FastLED.setBrightness(255);
 | 
					    FastLED.setBrightness(255);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (percentage < LubeConfig.TankRemindAtPercentage)
 | 
					    if (globals.TankPercentage < LubeConfig.TankRemindAtPercentage)
 | 
				
			||||||
      leds[0] = CRGB::OrangeRed;
 | 
					      leds[0] = CRGB::OrangeRed;
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      leds[0] = CRGB::White;
 | 
					      leds[0] = CRGB::White;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,13 @@
 | 
				
			|||||||
    #if PCB_REV < 1 || PCB_REV > 4
 | 
					    #if PCB_REV < 1 || PCB_REV > 4
 | 
				
			||||||
        #error "Unsupported PCB-Revision"
 | 
					        #error "Unsupported PCB-Revision"
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #if PCB_REV < 4 && defined(FEATURE_ENABLE_CAN)
 | 
				
			||||||
 | 
					        #error "CAN-Feature unsupported with this PCB-Rev"
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
 | 
					    #if PCB_REV < 4 && defined(DFEATURE_ENABLE_GPS)
 | 
				
			||||||
 | 
					        #error "CAN-Feature unsupported with this PCB-Rev"
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ADMIN_PASSWORD
 | 
					#ifndef ADMIN_PASSWORD
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,11 +16,16 @@ void initWebUI()
 | 
				
			|||||||
  if (!LittleFS.begin())
 | 
					  if (!LittleFS.begin())
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    Serial.println("An Error has occurred while mounting LittleFS");
 | 
					    Serial.println("An Error has occurred while mounting LittleFS");
 | 
				
			||||||
    MaintainDTC(DTC_FLASHFS_ERROR, true);
 | 
					    MaintainDTC(DTC_FLASHFS_ERROR, DTC_CRITICAL, true);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  globals.FlashVersion = GetFlashVersion();
 | 
					  GetFlashVersion(globals.FlashVersion, sizeof(globals.FlashVersion));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!strcmp(globals.FlashVersion, QUOTE(FLASH_FS_VERSION))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    MaintainDTC(DTC_FLASHFS_VERSION_ERROR, DTC_WARN, true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MDNS.begin(globals.DeviceName);
 | 
					  MDNS.begin(globals.DeviceName);
 | 
				
			||||||
  MDNS.addService("telnet", "tcp", 23);
 | 
					  MDNS.addService("telnet", "tcp", 23);
 | 
				
			||||||
@@ -117,7 +122,7 @@ String processor(const String &var)
 | 
				
			|||||||
    return "hidden";
 | 
					    return "hidden";
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  if (var == "SHOW_DTC_TABLE")
 | 
					  if (var == "SHOW_DTC_TABLE")
 | 
				
			||||||
    return globals.systemStatus == sysStat_Error ? "" : "hidden";
 | 
					    return globals.hasDTC ? "" : "hidden";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (var == "DTC_TABLE")
 | 
					  if (var == "DTC_TABLE")
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -137,6 +142,20 @@ String processor(const String &var)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        temp = temp + "<tr><td>" + String(buff_timestamp);
 | 
					        temp = temp + "<tr><td>" + String(buff_timestamp);
 | 
				
			||||||
        temp = temp + "</td><td>" + String(DTCStorage[i].Number) + "</td><td>";
 | 
					        temp = temp + "</td><td>" + String(DTCStorage[i].Number) + "</td><td>";
 | 
				
			||||||
 | 
					        temp = temp + "<img src=static/img/";
 | 
				
			||||||
 | 
					        switch (DTCStorage[i].severity)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        case DTC_CRITICAL:
 | 
				
			||||||
 | 
					          temp = temp + "critical";
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        case DTC_WARN:
 | 
				
			||||||
 | 
					          temp = temp + "warn";
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        case DTC_INFO:
 | 
				
			||||||
 | 
					          temp = temp + "info";
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        temp = temp + "_black.png></td><td>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (DTCStorage[i].active == DTC_ACTIVE)
 | 
					        if (DTCStorage[i].active == DTC_ACTIVE)
 | 
				
			||||||
          temp = temp + "active";
 | 
					          temp = temp + "active";
 | 
				
			||||||
@@ -289,6 +308,15 @@ void WebserverPOST_Callback(AsyncWebServerRequest *request)
 | 
				
			|||||||
      PersistenceData.tankRemain_µl = LubeConfig.tankCapacity_ml * 1000;
 | 
					      PersistenceData.tankRemain_µl = LubeConfig.tankCapacity_ml * 1000;
 | 
				
			||||||
      globals.requestEEAction = EE_PDS_SAVE;
 | 
					      globals.requestEEAction = EE_PDS_SAVE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (p->name() == "reset_ee_cfg")
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      globals.requestEEAction = EE_CFG_FORMAT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (p->name() == "reset_ee_pds")
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      globals.requestEEAction = EE_PDS_FORMAT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
    // end: POST Form Maintenance
 | 
					    // end: POST Form Maintenance
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -298,20 +326,21 @@ void WebserverNotFound_Callback(AsyncWebServerRequest *request)
 | 
				
			|||||||
  request->send(404, "text/html", "Not found");
 | 
					  request->send(404, "text/html", "Not found");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t GetFlashVersion()
 | 
					void GetFlashVersion(char *buff, size_t buff_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    char buffer[20];
 | 
					 | 
				
			||||||
  File this_file = LittleFS.open("version", "r");
 | 
					  File this_file = LittleFS.open("version", "r");
 | 
				
			||||||
  if (!this_file)
 | 
					  if (!this_file)
 | 
				
			||||||
  { // failed to open the file, retrn empty result
 | 
					  { // failed to open the file, retrn empty result
 | 
				
			||||||
      return 0;
 | 
					    buff[0] = '\0';
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (this_file.available())
 | 
					  if (this_file.available())
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
      this_file.readBytesUntil('\r', buffer, sizeof(buffer));
 | 
					    int bytes_read;
 | 
				
			||||||
 | 
					    bytes_read = this_file.readBytesUntil('\r', buff, buff_size-1);
 | 
				
			||||||
 | 
					    buff[bytes_read] = '\0';
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  this_file.close();
 | 
					  this_file.close();
 | 
				
			||||||
  return atoi(buffer);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final)
 | 
					void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user