You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							168 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							168 lines
						
					
					
						
							4.2 KiB
						
					
					
				| /**
 | |
|  * Marlin 3D Printer Firmware
 | |
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | |
|  *
 | |
|  * Based on Sprinter and grbl.
 | |
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
 | |
|  *
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef __DURATION_T__
 | |
| #define __DURATION_T__
 | |
| 
 | |
| struct duration_t {
 | |
|   /**
 | |
|    * @brief Duration is stored in seconds
 | |
|    */
 | |
|   uint32_t value;
 | |
| 
 | |
|   /**
 | |
|    * @brief Constructor
 | |
|    */
 | |
|   duration_t()
 | |
|     : duration_t(0) {};
 | |
| 
 | |
|   /**
 | |
|    * @brief Constructor
 | |
|    *
 | |
|    * @param seconds The number of seconds
 | |
|    */
 | |
|   duration_t(uint32_t const &seconds) {
 | |
|     this->value = seconds;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Equality comparison
 | |
|    * @details Overloads the equality comparison operator
 | |
|    *
 | |
|    * @param value The number of seconds to compare to
 | |
|    * @return True if both durations are equal
 | |
|    */
 | |
|   bool operator==(const uint32_t &value) const {
 | |
|     return (this->value == value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Inequality comparison
 | |
|    * @details Overloads the inequality comparison operator
 | |
|    *
 | |
|    * @param value The number of seconds to compare to
 | |
|    * @return False if both durations are equal
 | |
|    */
 | |
|   bool operator!=(const uint32_t &value) const {
 | |
|     return ! this->operator==(value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as years
 | |
|    * @return The number of years
 | |
|    */
 | |
|   inline uint8_t year() const {
 | |
|     return this->day() / 365;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as days
 | |
|    * @return The number of days
 | |
|    */
 | |
|   inline uint16_t day() const {
 | |
|     return this->hour() / 24;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as hours
 | |
|    * @return The number of hours
 | |
|    */
 | |
|   inline uint32_t hour() const {
 | |
|     return this->minute() / 60;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as minutes
 | |
|    * @return The number of minutes
 | |
|    */
 | |
|   inline uint32_t minute() const {
 | |
|     return this->second() / 60;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as seconds
 | |
|    * @return The number of seconds
 | |
|    */
 | |
|   inline uint32_t second() const {
 | |
|     return this->value;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as a string
 | |
|    * @details String will be formated using a "full" representation of duration
 | |
|    *
 | |
|    * @param buffer The array pointed to must be able to accommodate 21 bytes
 | |
|    *
 | |
|    * Output examples:
 | |
|    *  123456789012345678901 (strlen)
 | |
|    *  135y 364d 23h 59m 59s
 | |
|    *  364d 23h 59m 59s
 | |
|    *  23h 59m 59s
 | |
|    *  59m 59s
 | |
|    *  59s
 | |
|    */
 | |
|   void toString(char *buffer) const {
 | |
|     int y = this->year(),
 | |
|         d = this->day() % 365,
 | |
|         h = this->hour() % 24,
 | |
|         m = this->minute() % 60,
 | |
|         s = this->second() % 60;
 | |
| 
 | |
|     if (y) sprintf_P(buffer, PSTR("%iy %id %ih %im %is"), y, d, h, m, s);
 | |
|     else if (d) sprintf_P(buffer, PSTR("%id %ih %im %is"), d, h, m, s);
 | |
|     else if (h) sprintf_P(buffer, PSTR("%ih %im %is"), h, m, s);
 | |
|     else if (m) sprintf_P(buffer, PSTR("%im %is"), m, s);
 | |
|     else sprintf_P(buffer, PSTR("%is"), s);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @brief Formats the duration as a string
 | |
|    * @details String will be formated using a "digital" representation of duration
 | |
|    *
 | |
|    * @param buffer The array pointed to must be able to accommodate 10 bytes
 | |
|    *
 | |
|    * Output examples:
 | |
|    *  123456789 (strlen)
 | |
|    *  99:59
 | |
|    *  11d 12:33
 | |
|    */
 | |
|   uint8_t toDigital(char *buffer, bool with_days=false) const {
 | |
|     uint16_t h = uint16_t(this->hour()),
 | |
|              m = uint16_t(this->minute() % 60UL);
 | |
|     if (with_days) {
 | |
|       uint16_t d = this->day();
 | |
|       sprintf_P(buffer, PSTR("%ud %02u:%02u"), d, h % 24, m);
 | |
|       return d >= 10 ? 8 : 7;
 | |
|     }
 | |
|     else if (h < 100) {
 | |
|       sprintf_P(buffer, PSTR("%02u:%02u"), h % 24, m);
 | |
|       return 5;
 | |
|     }
 | |
|     else {
 | |
|       sprintf_P(buffer, PSTR("%u:%02u"), h, m);
 | |
|       return 6;
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| #endif // __DURATION_T__
 |