Appiko
time_tracker.c
1 /*
2  * time_tracker.c : Module to keep track of time in MS_TIEMR ticks
3  * Copyright (C) 2019 Appiko
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
19 #include "time_tracker.h"
20 #include "string.h"
21 
22 
23 #define DAY_TICK_LENGTH (24 * 3600 * MS_TIMER_TICKS_MS(1000))
24 
25 #define NO_OF_MONTHS 12
26 
27 typedef struct
28 {
29  uint32_t log_time;
30  time_tracker_ddmmyy_t log_date;
31 }date_time_log_t;
32 
33 static uint32_t last_date[] = {0xff, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
34 
35 static date_time_log_t date_time;
36 
37 static uint32_t log_id;
38 
39 void update_date ()
40 {
41  //check if it's a last day of year
42  if(date_time.log_date.mm == NO_OF_MONTHS &&
43  date_time.log_date.dd == last_date[NO_OF_MONTHS])
44  {
45  //update year, and check if updated year is leap year
46  date_time.log_date.yy++;
47  //if it's leap year, make feb's last date 29
48  last_date[2] = (date_time.log_date.yy%4 == 0) ? 29 : 28;
49  //set date 01/01/updated year
50  date_time.log_date.dd = 1;
51  date_time.log_date.mm = 1;
52  return;
53  }
54 
55  //check if it's a last day of on going month
56  if(date_time.log_date.dd == last_date[date_time.log_date.mm])
57  {
58  //if it is, update month
59  date_time.log_date.mm++;
60  //set date 01/update month/running year
61  date_time.log_date.dd = 1;
62  return;
63  }
64 
65  //update date
66  date_time.log_date.dd++;
67  return;
68 }
69 
70 uint32_t time_tracker_init (uint32_t time_log)
71 {
72  log_id = time_log;
73  log_config_t log =
74  {
75  .log_id = log_id,
76  .entry_size = sizeof(date_time_log_t),
77  .start_page = TIME_TRACKER_NVM_PAGE_USED_0,
78  .no_of_pages = TIME_TRACKER_NVM_NO_PAGES_USED,
79 
80  };
81  //check if log is available
82  //if log is already being used check if it contains time track and fetch the
83  log_id = nvm_logger_log_init (&log);
84  if(nvm_logger_is_log_empty (log_id) == false)
85  {
86  //last entry from log to current time
87  nvm_logger_fetch_tail_data (log_id, &date_time, 1);
88  }
89  else
90  {
91  date_time.log_time = TIME_TRACKER_TIME_NOT_SET;
92  }
93  return log_id;
94 }
95 
96 void time_tracker_set_date_time (time_tracker_ddmmyy_t * p_date_ddmmyy, uint32_t time_s)
97 {
98  date_time.log_time = MS_TIMER_TICKS_MS(time_s * 1000);
99  memcpy(&date_time.log_date, p_date_ddmmyy, sizeof(time_tracker_ddmmyy_t));
100  nvm_logger_feed_data (log_id, &date_time);
101  last_date[2] = (date_time.log_date.yy%4 == 0) ? 29 : 28;
102 
103 }
104 
105 
106 void time_tracker_update_time (uint32_t ticks)
107 {
108  //update current time
109  date_time.log_time = (date_time.log_time + ticks);
110  if(date_time.log_time > DAY_TICK_LENGTH)
111  {
112  update_date ();
113  date_time.log_time = date_time.log_time - DAY_TICK_LENGTH;
114  }
115  //add current date and time entry in time tracking log
116  nvm_logger_feed_data (log_id, &date_time);
117 }
118 
119 
121 {
122  return (date_time.log_time/MS_TIMER_FREQ);
123 }
124 
125 time_tracker_ddmmyy_t * time_tracker_get_current_date ()
126 {
127  return &date_time.log_date;
128 }
129 
uint32_t time_tracker_init(uint32_t time_log)
Function to initiate the time tracker module.
Definition: time_tracker.c:70
time_tracker_ddmmyy_t * time_tracker_get_current_date()
Function to get current date.
Definition: time_tracker.c:125
void time_tracker_set_date_time(time_tracker_ddmmyy_t *p_date_ddmmyy, uint32_t time_s)
Function to set current time.
Definition: time_tracker.c:96
uint32_t time_tracker_get_current_time_s()
Function to get current time in ms.
Definition: time_tracker.c:120
#define MS_TIMER_TICKS_MS(ms)
Definition: ms_timer.h:64
#define MS_TIMER_FREQ
Definition: ms_timer.h:55
void time_tracker_update_time(uint32_t ticks)
Function to update time.
Definition: time_tracker.c:106