123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- #include <iostream>
- #include <vector>
- #include <string>
- #define UPS_MODE_MONITOR
- using namespace std;
- #define TM_RTC_LEAP_YEAR(year) ((((year) % 4 == 0) && ((year) % 100 != 0)) || ((year) % 400 == 0))
- #define TM_RTC_DAYS_IN_YEAR(x) (bool)TM_RTC_LEAP_YEAR(x) ? 366 : 365
- #define TM_RTC_OFFSET_YEAR 1970
- #define TM_RTC_SECONDS_PER_DAY 86400
- #define TM_RTC_SECONDS_PER_HOUR 3600
- #define TM_RTC_SECONDS_PER_MINUTE 60
- #define TM_RTC_BCD2BIN(x) ((((x) >> 4) & 0x0F) * 10 + ((x) & 0x0F))
- #define TM_RTC_CHAR2NUM(x) ((x) - '0')
- #define TM_RTC_CHARISNUM(x) ((x) >= '0' && (x) <= '9')
- typedef struct {
- uint8_t seconds; /*!< Seconds parameter, from 00 to 59 */
- uint16_t subseconds; /*!< Subsecond downcounter. When it reaches zero, it's reload value is the same as
- @ref RTC_SYNC_PREDIV, so in our case 0x3FF = 1023, 1024 steps in one second */
- uint8_t minutes; /*!< Minutes parameter, from 00 to 59 */
- uint8_t hours; /*!< Hours parameter, 24Hour mode, 00 to 23 */
- uint8_t day; /*!< Day in a week, from 1 to 7 */
- uint8_t date; /*!< Date in a month, 1 to 31 */
- uint8_t month; /*!< Month in a year, 1 to 12 */
- uint8_t year; /*!< Year parameter, 00 to 99, 00 is 2000 and 99 is 2099 */
- uint32_t unixx; /*!< Seconds from 01.01.1970 00:00:00 */
- } TM_RTC_t;
- uint8_t TM_RTC_Months[2][12] = {
- {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, /* Not leap year */
- {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} /* Leap year */
- };
- void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unixx);
- //void TM_RTC_GetDateTime(TM_RTC_t* data, TM_RTC_Format_t format);
- int main()
- {
- #if 0
- vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
-
- for (const string& word : msg)
- {
- cout << word << " ";
- }
- cout << endl;
- #endif
- //printf("This year is :%u, %u\r\n", TM_RTC_LEAP_YEAR(2023), TM_RTC_DAYS_IN_YEAR(2023), TM_RTC_Months(2));
- //printf("This year is :%u\r\n", TM_RTC_Months[TM_RTC_LEAP_YEAR(24)][1]);
- TM_RTC_t data;
- TM_RTC_GetDateTimeFromUnix(&data, 1672640327); // Mon Jan 02 2023 06:18:47 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1676189542); // Sun Feb 12 2023 08:12:22 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1683619942); // Tue May 09 2023 08:12:22 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1694333542); // Sun Sep 10 2023 08:12:22 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1704010342); // Sun Dec 31 2023 08:12:22 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
- TM_RTC_GetDateTimeFromUnix(&data, 1706688742); // Wed Jan 31 2024 08:12:22 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1709194342); // Thu Feb 29 2024 08:12:22 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1709281315); // Fri Mar 01 2024 08:21:55 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1718180601); // Wed Jun 12 2024 08:23:21 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- TM_RTC_GetDateTimeFromUnix(&data, 1735633401); // Tue Dec 31 2024 08:23:21 GMT+0000
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
-
- TM_RTC_GetDateTimeFromUnix(&data, 1709101127);
- printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
- //TM_RTC_GetDateTimeFromUnix(&data, 1709204345);
- }
- void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unixx) {
- uint16_t year;
-
- /* Store unix time to unix in struct */
- data->unixx = unixx;
- /* Get seconds from unix */
- data->seconds = unix % 60;
- /* Go to minutes */
- unixx /= 60;
- /* Get minutes */
- data->minutes = unixx % 60;
- /* Go to hours */
- unixx /= 60;
- /* Get hours */
- data->hours = unixx % 24;
- /* Go to days */
- unixx /= 24;
-
- /* Get week day */
- /* Monday is day one */
- data->day = (unix + 3) % 7 + 1;
- /* Get year */
- year = 1970;
- while (1) {
- if (TM_RTC_LEAP_YEAR(year)) {
- if (unixx >= 366) {
- unixx -= 366;
- } else {
- break;
- }
- } else if (unixx >= 365) {
- unixx -= 365;
- } else {
- break;
- }
- year++;
- }
- /* Get year in xx format */
- data->year = (uint8_t) (year - 2000);
- /* Get month */
- for (data->month = 0; data->month < 12; data->month++) {
- /*
- if (unixx == 0) {
- break;
- }
- */
- if (TM_RTC_LEAP_YEAR(year) && unixx >= (uint32_t)TM_RTC_Months[1][data->month]) {
- unixx -= TM_RTC_Months[1][data->month];
- } else if (!TM_RTC_LEAP_YEAR(year) && unixx >= (uint32_t)TM_RTC_Months[0][data->month]) {
- unixx -= TM_RTC_Months[0][data->month];
- } else {
- break;
- }
- }
- /* Get month */
- /* Month starts with 1 */
- data->month++;
- /* Get date */
- /* Date starts with 1 */
- data->date = unixx + 1;
- }
- void ups_mode_response(char *data)
- {
- char value[50];
- uint8_t len = 0;
- DBG printf("ups_serialresponse: %s\r\n", data);
- if (data[0] != '(') {
- return;
- }
- DBG printf("ups_serial_parser_start\r\n");
- UPS.Present = UPS_CONNECTED;
- UPS.Flag_Present = true;
- UPS.cnt_err_ups = 0;
- data++;
- DBG printf("UPS ups_mode_parser_start: %s\r\n", data);
- if (UPS.Mode != data[0]) {
- UPS.Mode = data[0];
- #if 1
- memset(value, 0, sizeof(value));
- GetModeStr(value, &len);
- if(UPS.Mode == 'F') {
- memset(ups_pdu.data, 0, UPS_PDU_MAX_LEN);
- send_MegaTec_cmd(ups_fault_status);
- if (ups_megatec_rx_pdu()) {
- if (ups_pdu.data[0] != '(' || strncmp(ups_pdu.data, "(OK", 3) == 0) {
- return;
- }
- UPS.fault_type = (ups_pdu.data[1] - 0x30) << 4 | (ups_pdu.data[2] - 0x30);
- strncat(value, &ups_pdu.data[1], 6);
- strncat(value, &ups_pdu.data[14], 4);
- strncat(value, &ups_pdu.data[25], 8);
- strncat(value, &ups_pdu.data[35], 4);
- strncat(value, &ups_pdu.data[41], 4);
- strncat(value, &ups_pdu.data[47], 4);
- strncat(value, &ups_pdu.data[53], 4);
- strncat(value, &ups_pdu.data[59], 8);
- }
- }
- SNMP_SendUserTrap(UPS_MODE);
- syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
- log_event_data(LOG_UPS_MODE, value);
- #endif
- }
-
- }
|