Pedro Campos
/
SERVOS_V0_3
test
epoch_to_time.cpp@8:b4465148d206, 2021-09-07 (annotated)
- Committer:
- dapi08
- Date:
- Tue Sep 07 10:28:08 2021 +0000
- Revision:
- 8:b4465148d206
- Parent:
- 2:82fdfeec5799
SERVOS_V0_3 test de control
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dapi08 | 2:82fdfeec5799 | 1 | /* |
dapi08 | 2:82fdfeec5799 | 2 | EPOCH to human readable time and date converter for microcontrollers (PIC, AVR, Arduino, STM32) |
dapi08 | 2:82fdfeec5799 | 3 | Current EPOCH time can be found at https://www.epochconverter.com/ |
dapi08 | 2:82fdfeec5799 | 4 | The code can be suitably modified to suit your requirements. I have extensively |
dapi08 | 2:82fdfeec5799 | 5 | tested this code with valid inputs. If you have any questions or if you find a bug, please contact me. |
dapi08 | 2:82fdfeec5799 | 6 | Author: Siddharth Singh <sidsingh78@gmail.com> |
dapi08 | 2:82fdfeec5799 | 7 | Ver:1.0 |
dapi08 | 2:82fdfeec5799 | 8 | Date: June 15, 2017 |
dapi08 | 2:82fdfeec5799 | 9 | */ |
dapi08 | 2:82fdfeec5799 | 10 | |
dapi08 | 2:82fdfeec5799 | 11 | |
dapi08 | 2:82fdfeec5799 | 12 | #include <stdio.h> |
dapi08 | 2:82fdfeec5799 | 13 | #include <stdlib.h> |
dapi08 | 2:82fdfeec5799 | 14 | |
dapi08 | 2:82fdfeec5799 | 15 | |
dapi08 | 2:82fdfeec5799 | 16 | |
dapi08 | 2:82fdfeec5799 | 17 | unsigned char ntp_hour, ntp_minute, ntp_second, ntp_week_day, ntp_date, ntp_month, leap_days, leap_year_ind ; |
dapi08 | 2:82fdfeec5799 | 18 | unsigned short temp_days; |
dapi08 | 2:82fdfeec5799 | 19 | unsigned int epoch, ntp_year, days_since_epoch, day_of_year; |
dapi08 | 2:82fdfeec5799 | 20 | |
dapi08 | 2:82fdfeec5799 | 21 | |
dapi08 | 2:82fdfeec5799 | 22 | |
dapi08 | 2:82fdfeec5799 | 23 | static unsigned char month_days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; |
dapi08 | 2:82fdfeec5799 | 24 | static unsigned char week_days[7] = {4,5,6,0,1,2,3}; |
dapi08 | 2:82fdfeec5799 | 25 | //Thu=4, Fri=5, Sat=6, Sun=0, Mon=1, Tue=2, Wed=3 |
dapi08 | 2:82fdfeec5799 | 26 | |
dapi08 | 2:82fdfeec5799 | 27 | char key; |
dapi08 | 2:82fdfeec5799 | 28 | |
dapi08 | 2:82fdfeec5799 | 29 | |
dapi08 | 2:82fdfeec5799 | 30 | void epoch_to_time(long epoch) |
dapi08 | 2:82fdfeec5799 | 31 | { |
dapi08 | 2:82fdfeec5799 | 32 | //---------------------------- Input and Calculations ------------------------------------- |
dapi08 | 2:82fdfeec5799 | 33 | //start: |
dapi08 | 2:82fdfeec5799 | 34 | leap_days=0; |
dapi08 | 2:82fdfeec5799 | 35 | leap_year_ind=0; |
dapi08 | 2:82fdfeec5799 | 36 | // printf("-------------------------------------------\n"); |
dapi08 | 2:82fdfeec5799 | 37 | // printf("Enter EPOCH => "); |
dapi08 | 2:82fdfeec5799 | 38 | // scanf ("%d",&epoch); |
dapi08 | 2:82fdfeec5799 | 39 | |
dapi08 | 2:82fdfeec5799 | 40 | // Add or substract time zone here. |
dapi08 | 2:82fdfeec5799 | 41 | // epoch+=19800 ; //GMT +5:30 = +19800 seconds |
dapi08 | 2:82fdfeec5799 | 42 | |
dapi08 | 2:82fdfeec5799 | 43 | ntp_second = epoch%60; |
dapi08 | 2:82fdfeec5799 | 44 | epoch /= 60; |
dapi08 | 2:82fdfeec5799 | 45 | ntp_minute = epoch%60; |
dapi08 | 2:82fdfeec5799 | 46 | epoch /= 60; |
dapi08 | 2:82fdfeec5799 | 47 | ntp_hour = epoch%24; |
dapi08 | 2:82fdfeec5799 | 48 | epoch /= 24; |
dapi08 | 2:82fdfeec5799 | 49 | |
dapi08 | 2:82fdfeec5799 | 50 | days_since_epoch = epoch; //number of days since epoch |
dapi08 | 2:82fdfeec5799 | 51 | ntp_week_day = week_days[days_since_epoch%7]; //Calculating WeekDay |
dapi08 | 2:82fdfeec5799 | 52 | |
dapi08 | 2:82fdfeec5799 | 53 | ntp_year = 1970+(days_since_epoch/365); // ball parking year, may not be accurate! |
dapi08 | 2:82fdfeec5799 | 54 | |
dapi08 | 2:82fdfeec5799 | 55 | int i; |
dapi08 | 2:82fdfeec5799 | 56 | for (i=1972; i<ntp_year; i+=4) // Calculating number of leap days since epoch/1970 |
dapi08 | 2:82fdfeec5799 | 57 | if(((i%4==0) && (i%100!=0)) || (i%400==0)) leap_days++; |
dapi08 | 2:82fdfeec5799 | 58 | |
dapi08 | 2:82fdfeec5799 | 59 | ntp_year = 1970+((days_since_epoch - leap_days)/365); // Calculating accurate current year by (days_since_epoch - extra leap days) |
dapi08 | 2:82fdfeec5799 | 60 | day_of_year = ((days_since_epoch - leap_days)%365)+1; |
dapi08 | 2:82fdfeec5799 | 61 | |
dapi08 | 2:82fdfeec5799 | 62 | |
dapi08 | 2:82fdfeec5799 | 63 | if(((ntp_year%4==0) && (ntp_year%100!=0)) || (ntp_year%400==0)) |
dapi08 | 2:82fdfeec5799 | 64 | { |
dapi08 | 2:82fdfeec5799 | 65 | month_days[1]=29; //February = 29 days for leap years |
dapi08 | 2:82fdfeec5799 | 66 | leap_year_ind = 1; //if current year is leap, set indicator to 1 |
dapi08 | 2:82fdfeec5799 | 67 | } |
dapi08 | 2:82fdfeec5799 | 68 | else month_days[1]=28; //February = 28 days for non-leap years |
dapi08 | 2:82fdfeec5799 | 69 | |
dapi08 | 2:82fdfeec5799 | 70 | temp_days=0; |
dapi08 | 2:82fdfeec5799 | 71 | |
dapi08 | 2:82fdfeec5799 | 72 | for (ntp_month=0 ; ntp_month <= 11 ; ntp_month++) //calculating current Month |
dapi08 | 2:82fdfeec5799 | 73 | { |
dapi08 | 2:82fdfeec5799 | 74 | if (day_of_year <= temp_days) break; |
dapi08 | 2:82fdfeec5799 | 75 | temp_days = temp_days + month_days[ntp_month]; |
dapi08 | 2:82fdfeec5799 | 76 | } |
dapi08 | 2:82fdfeec5799 | 77 | |
dapi08 | 2:82fdfeec5799 | 78 | temp_days = temp_days - month_days[ntp_month-1]; //calculating current Date |
dapi08 | 2:82fdfeec5799 | 79 | ntp_date = day_of_year - temp_days; |
dapi08 | 2:82fdfeec5799 | 80 | |
dapi08 | 2:82fdfeec5799 | 81 | // // -------------------- Printing Results ------------------------------------- |
dapi08 | 2:82fdfeec5799 | 82 | // |
dapi08 | 2:82fdfeec5799 | 83 | // switch(ntp_week_day) { |
dapi08 | 2:82fdfeec5799 | 84 | // |
dapi08 | 2:82fdfeec5799 | 85 | // case 0: printf("\nSunday"); |
dapi08 | 2:82fdfeec5799 | 86 | // break; |
dapi08 | 2:82fdfeec5799 | 87 | // case 1: printf("\nMonday"); |
dapi08 | 2:82fdfeec5799 | 88 | // break; |
dapi08 | 2:82fdfeec5799 | 89 | // case 2: printf("\nTuesday"); |
dapi08 | 2:82fdfeec5799 | 90 | // break; |
dapi08 | 2:82fdfeec5799 | 91 | // case 3: printf("\nWednesday"); |
dapi08 | 2:82fdfeec5799 | 92 | // break; |
dapi08 | 2:82fdfeec5799 | 93 | // case 4: printf("\nThursday"); |
dapi08 | 2:82fdfeec5799 | 94 | // break; |
dapi08 | 2:82fdfeec5799 | 95 | // case 5: printf("\nFriday"); |
dapi08 | 2:82fdfeec5799 | 96 | // break; |
dapi08 | 2:82fdfeec5799 | 97 | // case 6: printf("\nSaturday"); |
dapi08 | 2:82fdfeec5799 | 98 | // break; |
dapi08 | 2:82fdfeec5799 | 99 | // default: break; |
dapi08 | 2:82fdfeec5799 | 100 | // } |
dapi08 | 2:82fdfeec5799 | 101 | // printf(", "); |
dapi08 | 2:82fdfeec5799 | 102 | // |
dapi08 | 2:82fdfeec5799 | 103 | // switch(ntp_month) { |
dapi08 | 2:82fdfeec5799 | 104 | // |
dapi08 | 2:82fdfeec5799 | 105 | // case 1: printf("January"); |
dapi08 | 2:82fdfeec5799 | 106 | // break; |
dapi08 | 2:82fdfeec5799 | 107 | // case 2: printf("February"); |
dapi08 | 2:82fdfeec5799 | 108 | // break; |
dapi08 | 2:82fdfeec5799 | 109 | // case 3: printf("March"); |
dapi08 | 2:82fdfeec5799 | 110 | // break; |
dapi08 | 2:82fdfeec5799 | 111 | // case 4: printf("April"); |
dapi08 | 2:82fdfeec5799 | 112 | // break; |
dapi08 | 2:82fdfeec5799 | 113 | // case 5: printf("May"); |
dapi08 | 2:82fdfeec5799 | 114 | // break; |
dapi08 | 2:82fdfeec5799 | 115 | // case 6: printf("June"); |
dapi08 | 2:82fdfeec5799 | 116 | // break; |
dapi08 | 2:82fdfeec5799 | 117 | // case 7: printf("July"); |
dapi08 | 2:82fdfeec5799 | 118 | // break; |
dapi08 | 2:82fdfeec5799 | 119 | // case 8: printf("August"); |
dapi08 | 2:82fdfeec5799 | 120 | // break; |
dapi08 | 2:82fdfeec5799 | 121 | // case 9: printf("September"); |
dapi08 | 2:82fdfeec5799 | 122 | // break; |
dapi08 | 2:82fdfeec5799 | 123 | // case 10: printf("October"); |
dapi08 | 2:82fdfeec5799 | 124 | // break; |
dapi08 | 2:82fdfeec5799 | 125 | // case 11: printf("November"); |
dapi08 | 2:82fdfeec5799 | 126 | // break; |
dapi08 | 2:82fdfeec5799 | 127 | // case 12: printf("December"); |
dapi08 | 2:82fdfeec5799 | 128 | // default: break; |
dapi08 | 2:82fdfeec5799 | 129 | // } |
dapi08 | 2:82fdfeec5799 | 130 | // |
dapi08 | 2:82fdfeec5799 | 131 | // printf(" %2d",ntp_date); |
dapi08 | 2:82fdfeec5799 | 132 | // printf(", %d\n",ntp_year); |
dapi08 | 2:82fdfeec5799 | 133 | // printf("TIME = %2d : %2d : %2d\n\n", ntp_hour,ntp_minute,ntp_second) ; |
dapi08 | 2:82fdfeec5799 | 134 | // printf("Days since Epoch: %d\n",days_since_epoch); |
dapi08 | 2:82fdfeec5799 | 135 | // printf("Number of Leap days since EPOCH: %d\n",leap_days); |
dapi08 | 2:82fdfeec5799 | 136 | // printf("Day of year = %d\n", day_of_year); |
dapi08 | 2:82fdfeec5799 | 137 | // printf("Is Year Leap? %d\n",leap_year_ind); |
dapi08 | 2:82fdfeec5799 | 138 | // printf("===============================================\n"); |
dapi08 | 2:82fdfeec5799 | 139 | // printf(" Press e to EXIT, or any other key to repeat...\n\n"); |
dapi08 | 2:82fdfeec5799 | 140 | // key=getch(); |
dapi08 | 2:82fdfeec5799 | 141 | // if (key!='e') goto start; |
dapi08 | 2:82fdfeec5799 | 142 | // return 0; |
dapi08 | 2:82fdfeec5799 | 143 | } |