Add functions for DS1388 and GPS for time saving and recovery
This commit is contained in:
		
							parent
							
								
									5afcea1e2e
								
							
						
					
					
						commit
						7c6446676f
					
				| 
						 | 
				
			
			@ -81,7 +81,7 @@ void sensorTask(void *param){
 | 
			
		|||
    RTC_DS1388 ds1388;              // RTC DS1388
 | 
			
		||||
 | 
			
		||||
    // Init sensor stuff
 | 
			
		||||
    bool DS1388_ready = false;      // DS1388 initialized and ready to use
 | 
			
		||||
    bool RTC_ready = false;      // DS1388 initialized and ready to use
 | 
			
		||||
    bool GPS_ready = false;         // GPS initialized and ready to use
 | 
			
		||||
    bool BME280_ready = false;      // BME280 initialized and ready to use
 | 
			
		||||
    bool BMP280_ready = false;      // BMP280 initialized and ready to use
 | 
			
		||||
| 
						 | 
				
			
			@ -123,17 +123,18 @@ void sensorTask(void *param){
 | 
			
		|||
 | 
			
		||||
    // Settings for RTC
 | 
			
		||||
    String rtcOn=api->getConfig()->getConfigItem(api->getConfig()->useRTC,true)->asString();
 | 
			
		||||
        if(String(rtcOn) == "DS1833"){
 | 
			
		||||
        if(String(rtcOn) == "DS1388"){
 | 
			
		||||
            if (!ds1388.begin()) {
 | 
			
		||||
                RTC_ready = false;
 | 
			
		||||
                api->getLogger()->logDebug(GwLog::ERROR,"Modul DS1388 not found, check wiring");
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                api->getLogger()->logDebug(GwLog::LOG,"Modul DS1388 found");
 | 
			
		||||
                uint year = ds1388.now().year();
 | 
			
		||||
                if(year < 2023){
 | 
			
		||||
                    ds1388.adjust(DateTime(__DATE__, __TIME__));  // Set date and time from PC file time
 | 
			
		||||
                    // ds1388.adjust(DateTime(__DATE__, __TIME__));  // Set date and time from PC file time
 | 
			
		||||
                }
 | 
			
		||||
                DS1388_ready = true;
 | 
			
		||||
                RTC_ready = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -349,6 +350,7 @@ void sensorTask(void *param){
 | 
			
		|||
    long starttime9 = millis();     // Solar power sensor update all 1s
 | 
			
		||||
    long starttime10 = millis();    // Generator power sensor update all 1s
 | 
			
		||||
    long starttime11 = millis();    // Copy GPS data to RTC all 5min
 | 
			
		||||
    long starttime12 = millis();    // Get RTC data all 500ms
 | 
			
		||||
 | 
			
		||||
    tN2kMsg N2kMsg;
 | 
			
		||||
    shared->setSensorData(sensors); //set initially read values
 | 
			
		||||
| 
						 | 
				
			
			@ -378,22 +380,52 @@ void sensorTask(void *param){
 | 
			
		|||
            }
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
        // Copy GPS data to RTC all 5min
 | 
			
		||||
        // If RTC DS1388 ready, then copy GPS data to RTC all 5min
 | 
			
		||||
        if(millis() > starttime11 + 5*60*1000){
 | 
			
		||||
            starttime11 = millis();
 | 
			
		||||
            if(rtcOn == "DS1388" && DS1388_ready == true){
 | 
			
		||||
            if(rtcOn == "DS1388" && RTC_ready == true && GPS_ready == true){
 | 
			
		||||
                api->getBoatDataValues(2,valueList);
 | 
			
		||||
                if(gpsdays->valid && gpsseconds->valid){
 | 
			
		||||
                    long ts = tNMEA0183Msg::daysToTime_t(gpsdays->value)+floor(gpsseconds->value);
 | 
			
		||||
                    long ts = tNMEA0183Msg::daysToTime_t(gpsdays->value - (30*365+7))+floor(gpsseconds->value); // Adjusted to reference year 2000 (-30 years and 7 days for switch years)
 | 
			
		||||
                    // sample input: date = "Dec 26 2009", time = "12:34:56"
 | 
			
		||||
                    // ds1388.adjust(DateTime("Dec 26 2009", "12:34:56"));
 | 
			
		||||
                    DateTime adjusttime(ts);
 | 
			
		||||
                    api->getLogger()->logDebug(GwLog::LOG,"Adjust time: %04d/%02d/%02d %02d:%02d:%02d",adjusttime.year(), adjusttime.month(), adjusttime.day(), adjusttime.hour(), adjusttime.minute(), adjusttime.second());
 | 
			
		||||
                    api->getLogger()->logDebug(GwLog::LOG,"Adjust RTC time: %04d/%02d/%02d %02d:%02d:%02d",adjusttime.year(), adjusttime.month(), adjusttime.day(), adjusttime.hour(), adjusttime.minute(), adjusttime.second());
 | 
			
		||||
                    // Adjust RTC time as unix time value
 | 
			
		||||
                    ds1388.adjust(adjusttime);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If GPS not ready or installed then send RTC time on bus all 500ms
 | 
			
		||||
        if(millis() > starttime12 + 500){
 | 
			
		||||
            starttime12 = millis();
 | 
			
		||||
            if(rtcOn == "DS1388" && RTC_ready == true && GPS_ready == false){
 | 
			
		||||
                // https://de.wikipedia.org/wiki/Unixzeit
 | 
			
		||||
                const short daysOfYear[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
 | 
			
		||||
                long unixtime = ds1388.now().get();
 | 
			
		||||
                uint16_t year = ds1388.now().year();
 | 
			
		||||
                uint8_t month = ds1388.now().month();
 | 
			
		||||
                uint8_t hour = ds1388.now().hour();
 | 
			
		||||
                uint8_t minute = ds1388.now().minute();
 | 
			
		||||
                uint8_t second = ds1388.now().second();
 | 
			
		||||
                uint8_t day = ds1388.now().day();
 | 
			
		||||
                uint16_t switchYear = ((year-1)-1968)/4 - ((year-1)-1900)/100 + ((year-1)-1600)/400;
 | 
			
		||||
                long daysAt1970 = (year-1970)*365 + switchYear + daysOfYear[month-1] + day-1;
 | 
			
		||||
                // If switch year then add one day
 | 
			
		||||
                if ( (month>2) && (year%4==0 && (year%100!=0 || year%400==0)) ){
 | 
			
		||||
                    daysAt1970 += 1;
 | 
			
		||||
                }
 | 
			
		||||
                double sysTime = (hour * 3600) + (minute * 60) + second;
 | 
			
		||||
                if(!isnan(daysAt1970) && !isnan(sysTime)){
 | 
			
		||||
                    // api->getLogger()->logDebug(GwLog::LOG,"RTC time: %04d/%02d/%02d %02d:%02d:%02d",year, month, day, hour, minute, second);
 | 
			
		||||
                    // api->getLogger()->logDebug(GwLog::LOG,"Send PGN126992: %10d %10d",daysAt1970, (uint16_t)sysTime);
 | 
			
		||||
                    SetN2kPGN126992(N2kMsg,0,daysAt1970,sysTime,N2ktimes_LocalCrystalClock);
 | 
			
		||||
                    api->sendN2kMessage(N2kMsg);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Send supplay voltage value all 1s
 | 
			
		||||
        if(millis() > starttime5 + 1000 && String(powsensor1) == "off"){
 | 
			
		||||
            starttime5 = millis();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue