test.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #define UPS_MODE_MONITOR
  5. using namespace std;
  6. #define TM_RTC_LEAP_YEAR(year) ((((year) % 4 == 0) && ((year) % 100 != 0)) || ((year) % 400 == 0))
  7. #define TM_RTC_DAYS_IN_YEAR(x) (bool)TM_RTC_LEAP_YEAR(x) ? 366 : 365
  8. #define TM_RTC_OFFSET_YEAR 1970
  9. #define TM_RTC_SECONDS_PER_DAY 86400
  10. #define TM_RTC_SECONDS_PER_HOUR 3600
  11. #define TM_RTC_SECONDS_PER_MINUTE 60
  12. #define TM_RTC_BCD2BIN(x) ((((x) >> 4) & 0x0F) * 10 + ((x) & 0x0F))
  13. #define TM_RTC_CHAR2NUM(x) ((x) - '0')
  14. #define TM_RTC_CHARISNUM(x) ((x) >= '0' && (x) <= '9')
  15. typedef struct {
  16. uint8_t seconds; /*!< Seconds parameter, from 00 to 59 */
  17. uint16_t subseconds; /*!< Subsecond downcounter. When it reaches zero, it's reload value is the same as
  18. @ref RTC_SYNC_PREDIV, so in our case 0x3FF = 1023, 1024 steps in one second */
  19. uint8_t minutes; /*!< Minutes parameter, from 00 to 59 */
  20. uint8_t hours; /*!< Hours parameter, 24Hour mode, 00 to 23 */
  21. uint8_t day; /*!< Day in a week, from 1 to 7 */
  22. uint8_t date; /*!< Date in a month, 1 to 31 */
  23. uint8_t month; /*!< Month in a year, 1 to 12 */
  24. uint8_t year; /*!< Year parameter, 00 to 99, 00 is 2000 and 99 is 2099 */
  25. uint32_t unixx; /*!< Seconds from 01.01.1970 00:00:00 */
  26. } TM_RTC_t;
  27. uint8_t TM_RTC_Months[2][12] = {
  28. {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, /* Not leap year */
  29. {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} /* Leap year */
  30. };
  31. void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unixx);
  32. //void TM_RTC_GetDateTime(TM_RTC_t* data, TM_RTC_Format_t format);
  33. int main()
  34. {
  35. #if 0
  36. vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
  37. for (const string& word : msg)
  38. {
  39. cout << word << " ";
  40. }
  41. cout << endl;
  42. #endif
  43. //printf("This year is :%u, %u\r\n", TM_RTC_LEAP_YEAR(2023), TM_RTC_DAYS_IN_YEAR(2023), TM_RTC_Months(2));
  44. //printf("This year is :%u\r\n", TM_RTC_Months[TM_RTC_LEAP_YEAR(24)][1]);
  45. TM_RTC_t data;
  46. TM_RTC_GetDateTimeFromUnix(&data, 1672640327); // Mon Jan 02 2023 06:18:47 GMT+0000
  47. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  48. TM_RTC_GetDateTimeFromUnix(&data, 1676189542); // Sun Feb 12 2023 08:12:22 GMT+0000
  49. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  50. TM_RTC_GetDateTimeFromUnix(&data, 1683619942); // Tue May 09 2023 08:12:22 GMT+0000
  51. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  52. TM_RTC_GetDateTimeFromUnix(&data, 1694333542); // Sun Sep 10 2023 08:12:22 GMT+0000
  53. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  54. TM_RTC_GetDateTimeFromUnix(&data, 1704010342); // Sun Dec 31 2023 08:12:22 GMT+0000
  55. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  56. printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  57. TM_RTC_GetDateTimeFromUnix(&data, 1706688742); // Wed Jan 31 2024 08:12:22 GMT+0000
  58. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  59. TM_RTC_GetDateTimeFromUnix(&data, 1709194342); // Thu Feb 29 2024 08:12:22 GMT+0000
  60. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  61. TM_RTC_GetDateTimeFromUnix(&data, 1709281315); // Fri Mar 01 2024 08:21:55 GMT+0000
  62. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  63. TM_RTC_GetDateTimeFromUnix(&data, 1718180601); // Wed Jun 12 2024 08:23:21 GMT+0000
  64. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  65. TM_RTC_GetDateTimeFromUnix(&data, 1735633401); // Tue Dec 31 2024 08:23:21 GMT+0000
  66. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  67. TM_RTC_GetDateTimeFromUnix(&data, 1709101127);
  68. printf("Month %u, Date %u, Year %u, %u:%u:%u\r\n", data.month, data.date, data.year, data.hours, data.minutes, data.seconds);
  69. //TM_RTC_GetDateTimeFromUnix(&data, 1709204345);
  70. }
  71. void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unixx) {
  72. uint16_t year;
  73. /* Store unix time to unix in struct */
  74. data->unixx = unixx;
  75. /* Get seconds from unix */
  76. data->seconds = unix % 60;
  77. /* Go to minutes */
  78. unixx /= 60;
  79. /* Get minutes */
  80. data->minutes = unixx % 60;
  81. /* Go to hours */
  82. unixx /= 60;
  83. /* Get hours */
  84. data->hours = unixx % 24;
  85. /* Go to days */
  86. unixx /= 24;
  87. /* Get week day */
  88. /* Monday is day one */
  89. data->day = (unix + 3) % 7 + 1;
  90. /* Get year */
  91. year = 1970;
  92. while (1) {
  93. if (TM_RTC_LEAP_YEAR(year)) {
  94. if (unixx >= 366) {
  95. unixx -= 366;
  96. } else {
  97. break;
  98. }
  99. } else if (unixx >= 365) {
  100. unixx -= 365;
  101. } else {
  102. break;
  103. }
  104. year++;
  105. }
  106. /* Get year in xx format */
  107. data->year = (uint8_t) (year - 2000);
  108. /* Get month */
  109. for (data->month = 0; data->month < 12; data->month++) {
  110. /*
  111. if (unixx == 0) {
  112. break;
  113. }
  114. */
  115. if (TM_RTC_LEAP_YEAR(year) && unixx >= (uint32_t)TM_RTC_Months[1][data->month]) {
  116. unixx -= TM_RTC_Months[1][data->month];
  117. } else if (!TM_RTC_LEAP_YEAR(year) && unixx >= (uint32_t)TM_RTC_Months[0][data->month]) {
  118. unixx -= TM_RTC_Months[0][data->month];
  119. } else {
  120. break;
  121. }
  122. }
  123. /* Get month */
  124. /* Month starts with 1 */
  125. data->month++;
  126. /* Get date */
  127. /* Date starts with 1 */
  128. data->date = unixx + 1;
  129. }
  130. void ups_mode_response(char *data)
  131. {
  132. char value[50];
  133. uint8_t len = 0;
  134. DBG printf("ups_serialresponse: %s\r\n", data);
  135. if (data[0] != '(') {
  136. return;
  137. }
  138. DBG printf("ups_serial_parser_start\r\n");
  139. UPS.Present = UPS_CONNECTED;
  140. UPS.Flag_Present = true;
  141. UPS.cnt_err_ups = 0;
  142. data++;
  143. DBG printf("UPS ups_mode_parser_start: %s\r\n", data);
  144. if (UPS.Mode != data[0]) {
  145. UPS.Mode = data[0];
  146. #if 1
  147. memset(value, 0, sizeof(value));
  148. GetModeStr(value, &len);
  149. if(UPS.Mode == 'F') {
  150. memset(ups_pdu.data, 0, UPS_PDU_MAX_LEN);
  151. send_MegaTec_cmd(ups_fault_status);
  152. if (ups_megatec_rx_pdu()) {
  153. if (ups_pdu.data[0] != '(' || strncmp(ups_pdu.data, "(OK", 3) == 0) {
  154. return;
  155. }
  156. UPS.fault_type = (ups_pdu.data[1] - 0x30) << 4 | (ups_pdu.data[2] - 0x30);
  157. strncat(value, &ups_pdu.data[1], 6);
  158. strncat(value, &ups_pdu.data[14], 4);
  159. strncat(value, &ups_pdu.data[25], 8);
  160. strncat(value, &ups_pdu.data[35], 4);
  161. strncat(value, &ups_pdu.data[41], 4);
  162. strncat(value, &ups_pdu.data[47], 4);
  163. strncat(value, &ups_pdu.data[53], 4);
  164. strncat(value, &ups_pdu.data[59], 8);
  165. }
  166. }
  167. SNMP_SendUserTrap(UPS_MODE);
  168. syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
  169. log_event_data(LOG_UPS_MODE, value);
  170. #endif
  171. }
  172. }