/** ****************************************************************************** * @file date_calc.c * @author AMG Energy Solution Team * @version V1.0.0 * @date 07-Feb-2022 * @brief This file provides all the header of the calculation datetime. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2022 AMG

****************************************************************************** */ /** @addtogroup mBMS2 * @{ */ /* Includes ------------------------------------------------------------------*/ #include #include "date_calc.h" #include "asutil.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ const uint16_t aMonth[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; const uint16_t bMonth[13] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; const uint8_t fstrWeek[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ uint32_t CalcDay(uint32_t iYear, uint32_t iMonth, uint32_t iDay) { uint8_t flag = false; uint32_t TotalDays, i, cnt; cnt = 0; for (i = 1; i < iYear; i++) { if (((i % 4) == 0 && (i % 100) !=0) || (i % 400) == 0) { // Leap year calculation. cnt++; } } if (((iYear % 4) == 0 && (iYear % 100) !=0) || (iYear % 400) == 0) flag = true; TotalDays = (iYear - 1) * 365 + cnt; if (flag == true) TotalDays += bMonth[iMonth - 1] + iDay; else TotalDays += aMonth[iMonth - 1] + iDay; return TotalDays; } uint8_t CheckLeapYear(uint16_t Year) { uint8_t result = false; if (((Year % 4) == 0 && (Year % 100) != 0) || (Year % 400) == 0) result = true; return result; } uint32_t CalcOneYearToDay(uint16_t Year) { uint32_t result; result = 365; if (((Year % 4) == 0 && (Year % 100) != 0) || (Year % 400) == 0) result++; return result; } //void CalcTimeStampToDateTime1(uint32_t TimeStamp, uint8_t *DateTime) //{ // uint32_t tDay, DivDay, ModDay, i; // uint32_t aDateStamp; // uint16_t tYear, tMonth, tDate; // aDateStamp = TimeStamp / 60 / 60 / 24; // aDateStamp++; // tDay = 0; // i = 0; // while (tDay < aDateStamp) { // tDay += CalcOneYearToDay(UTC_YEAR + i++); // if (i >= 100) break; // } // if (i < 100) { // i--; // tDay -= CalcOneYearToDay(UTC_YEAR + i); // tYear = UTC_YEAR + i; // DivDay = aDateStamp - tDay; // if (CheckLeapYear(tYear)) { // for (i = 1; i < 13; i++) // if (DivDay <= bMonth[i]) break; // } else { // for (i = 1; i < 13; i++) // if (DivDay <= aMonth[i]) break; // } // tMonth = i; // if (CheckLeapYear(tYear)) { // ModDay = DivDay - bMonth[i - 1]; // } else { // ModDay = DivDay - aMonth[i - 1]; // } // tDate = ModDay; // sprintf((char *)DateTime, "%04d/%02d/%02d", // tYear, // tMonth, // tDate // ); // } else { // sprintf((char *)DateTime, "----/--/--"); // } //} #ifdef CONSOLE_DEBUG void CalcDateStampToDateTime(uint32_t DateStamp, uint8_t *DateTime) { uint32_t DivDay, ModDay, tDay, i; uint16_t year, month, date; tDay = 0; i = 0; while (tDay < DateStamp) { tDay += CalcOneYearToDay(UTC_YEAR + i++); if (i >= 200) break; } if (i < 200) { i--; tDay -= CalcOneYearToDay(UTC_YEAR + i); year = UTC_YEAR + i; DivDay = DateStamp - tDay; if (CheckLeapYear(year)) { for (i = 0; i < 13; i++) if (DivDay <= bMonth[i]) break; } else { for (i = 0; i < 13; i++) if (DivDay <= aMonth[i]) break; } month = i; if (CheckLeapYear(year)) ModDay = DivDay - bMonth[i - 1]; else ModDay = DivDay - aMonth[i - 1]; date = ModDay; sprintf((char *)DateTime, "%04d/%02d/%02d", year, month, date ); } else { sprintf((char *)DateTime, "----/--/--"); } } #endif // #ifdef CONSOLE_DEBUG uint32_t DateStampToTimeStamp(uint32_t DateStamp, uint8_t Zone) { if (Zone == KOREA_ZONE) return (DateStamp * 24 * 60 * 60 - UTC_KOREA); else return (DateStamp * 24 * 60 * 60); } uint32_t DateStrToDateStamp(uint8_t *DateTime) { uint32_t year, month, date; uint32_t aDateStamp; year = atoin((char *)&DateTime[0], 4); month = atoin((char *)&DateTime[4], 2); date = atoin((char *)&DateTime[6], 2); aDateStamp = CalcDay(year, month, date) - UTC_TIMESTAMP; return (DateStampToTimeStamp(aDateStamp, KOREA_ZONE)); } uint32_t DateTimeStrToTimeStamp(uint8_t *DateTime) { uint32_t year, month, date; uint32_t hour, min, sec; uint32_t aDateStamp; uint32_t aTimeStamp; year = atoin((char *)&DateTime[0], 4); month = atoin((char *)&DateTime[4], 2); date = atoin((char *)&DateTime[6], 2); hour = atoin((char *)&DateTime[8], 2); min = atoin((char *)&DateTime[10], 2); sec = atoin((char *)&DateTime[12], 2); aDateStamp = CalcDay(year, month, date) - UTC_TIMESTAMP; printf("\r\n DateStamp = %d", aDateStamp); aTimeStamp = DateStampToTimeStamp(aDateStamp, GMT_ZONE) + (hour * 60 * 60) + (min * 60) + sec ; return (aTimeStamp); } /*******************(C)COPYRIGHT 2022 AMG ********************END OF FILE******/