Skip to content

Commit 51c5eef

Browse files
committed
Added time based sys variables
Ticket: CFE-4000 Signed-off-by: Victor Moene <[email protected]>
1 parent 6a52b58 commit 51c5eef

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

libenv/time_classes.c

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include <time_classes.h>
2626
#include <eval_context.h>
27+
#include <alloc.h> // xvasprintf
2728

2829
static void RemoveTimeClass(EvalContext *ctx, const char* tags)
2930
{
@@ -44,17 +45,34 @@ static void RemoveTimeClass(EvalContext *ctx, const char* tags)
4445
RlistDestroy(tags_rlist);
4546
}
4647

47-
StringSet *GetTimeClasses(time_t time) {
48+
static void InsertTimeClassF(StringMap *classes, const char *prefix, const char *type, const char *fmt, ...)
49+
{
50+
char *key;
51+
xasprintf(&key, "time_based_%s%s", prefix, type);
52+
53+
va_list args;
54+
va_start(args, fmt);
55+
56+
char *value;
57+
NDEBUG_UNUSED int ret = xvasprintf(&value, fmt, args);
58+
assert(ret >= 0);
59+
60+
va_end(args);
61+
StringMapInsert(classes, key, value);
62+
}
63+
64+
StringMap *GetTimeClasses(time_t time) {
4865
// The first element is the local timezone
4966
const char* tz_prefix[2] = { "", "GMT_" };
67+
const char* tz_var_prefix[2] = { "", "gmt_" };
5068
const char* tz_function[2] = { "localtime_r", "gmtime_r" };
5169
struct tm tz_parsed_time[2];
5270
const struct tm* tz_tm[2] = {
5371
localtime_r(&time, &(tz_parsed_time[0])),
5472
gmtime_r(&time, &(tz_parsed_time[1]))
5573
};
5674

57-
StringSet *classes = StringSetNew();
75+
StringMap *classes = StringMapNew();
5876

5977
for (int tz = 0; tz < 2; tz++)
6078
{
@@ -67,16 +85,14 @@ StringSet *GetTimeClasses(time_t time) {
6785
}
6886

6987
/* Lifecycle */
70-
71-
StringSetAddF(classes, "%sLcycle_%d", tz_prefix[tz], ((tz_parsed_time[tz].tm_year + 1900) % 3));
88+
InsertTimeClassF(classes, tz_var_prefix[tz], "lcycle", "%sLcycle_%d", tz_prefix[tz], ((tz_parsed_time[tz].tm_year + 1900) % 3));
7289

7390
/* Year */
74-
75-
StringSetAddF(classes, "%sYr%04d", tz_prefix[tz], tz_parsed_time[tz].tm_year + 1900);
91+
InsertTimeClassF(classes, tz_var_prefix[tz], "yr", "%sYr%04d", tz_prefix[tz], tz_parsed_time[tz].tm_year + 1900);
7692

7793
/* Month */
7894

79-
StringSetAddF(classes, "%s%s", tz_prefix[tz], MONTH_TEXT[tz_parsed_time[tz].tm_mon]);
95+
InsertTimeClassF(classes, tz_var_prefix[tz], "month", "%s%s", tz_prefix[tz], MONTH_TEXT[tz_parsed_time[tz].tm_mon]);
8096

8197
/* Day of week */
8298

@@ -85,55 +101,56 @@ StringSet *GetTimeClasses(time_t time) {
85101
...
86102
Sunday is 0 in tm_wday, 6 in DAY_TEXT */
87103
day_text_index = (tz_parsed_time[tz].tm_wday + 6) % 7;
88-
StringSetAddF(classes, "%s%s", tz_prefix[tz], DAY_TEXT[day_text_index]);
104+
InsertTimeClassF(classes, tz_var_prefix[tz], "dow", "%s%s", tz_prefix[tz], DAY_TEXT[day_text_index]);
89105

90106
/* Day */
91107

92-
StringSetAddF(classes, "%sDay%d", tz_prefix[tz], tz_parsed_time[tz].tm_mday);
108+
InsertTimeClassF(classes, tz_var_prefix[tz], "dom", "%sDay%d", tz_prefix[tz], tz_parsed_time[tz].tm_mday);
93109

94110
/* Shift */
95111

96-
StringSetAddF(classes, "%s%s", tz_prefix[tz], SHIFT_TEXT[tz_parsed_time[tz].tm_hour / 6]);
112+
InsertTimeClassF(classes, tz_var_prefix[tz], "pod", "%s%s", tz_prefix[tz], SHIFT_TEXT[tz_parsed_time[tz].tm_hour / 6]);
97113

98114
/* Hour */
99115

100-
StringSetAddF(classes, "%sHr%02d", tz_prefix[tz], tz_parsed_time[tz].tm_hour);
101-
StringSetAddF(classes, "%sHr%d", tz_prefix[tz], tz_parsed_time[tz].tm_hour);
116+
InsertTimeClassF(classes, tz_var_prefix[tz], "hr", "%sHr%02d", tz_prefix[tz], tz_parsed_time[tz].tm_hour);
117+
InsertTimeClassF(classes, tz_var_prefix[tz], "hr_2", "%sHr%d", tz_prefix[tz], tz_parsed_time[tz].tm_hour);
102118

103119
/* Quarter */
104120

105121
quarter = tz_parsed_time[tz].tm_min / 15 + 1;
106122

107-
StringSetAddF(classes, "%sQ%d", tz_prefix[tz], quarter);
108-
StringSetAddF(classes, "%sHr%02d_Q%d", tz_prefix[tz], tz_parsed_time[tz].tm_hour, quarter);
123+
InsertTimeClassF(classes, tz_var_prefix[tz], "qoh", "%sQ%d", tz_prefix[tz], quarter);
124+
InsertTimeClassF(classes, tz_var_prefix[tz], "hr_qoh", "%sHr%02d_Q%d", tz_prefix[tz], tz_parsed_time[tz].tm_hour, quarter);
109125

110126
/* Minute */
111127

112-
StringSetAddF(classes, "%sMin%02d", tz_prefix[tz], tz_parsed_time[tz].tm_min);
128+
InsertTimeClassF(classes, tz_var_prefix[tz], "min", "%sMin%02d", tz_prefix[tz], tz_parsed_time[tz].tm_min);
113129

114130
interval_start = (tz_parsed_time[tz].tm_min / 5) * 5;
115131
interval_end = (interval_start + 5) % 60;
116132

117-
StringSetAddF(classes, "%sMin%02d_%02d", tz_prefix[tz], interval_start, interval_end);
133+
InsertTimeClassF(classes, tz_var_prefix[tz], "min_span_5", "%sMin%02d_%02d", tz_prefix[tz], interval_start, interval_end);
118134
}
119135

120136
return classes;
121137
}
122138

123139
static void AddTimeClass(EvalContext *ctx, time_t time, const char* tags)
124140
{
125-
StringSet *time_classes = GetTimeClasses(time);
141+
StringMap *time_classes = GetTimeClasses(time);
126142
if (time_classes == NULL) {
127143
return;
128144
}
129145

130-
StringSetIterator iter = StringSetIteratorInit(time_classes);
131-
const char *time_class = NULL;
132-
while ((time_class = StringSetIteratorNext(&iter)) != NULL) {
133-
EvalContextClassPutHard(ctx, time_class, tags);
146+
StringMapIterator iter = StringMapIteratorInit(time_classes);
147+
MapKeyValue *item;
148+
while ((item = StringMapIteratorNext(&iter)) != NULL) {
149+
EvalContextClassPutHard(ctx, item->value, tags);
150+
EvalContextVariablePutSpecial(ctx, SPECIAL_SCOPE_SYS, item->key, item->value, CF_DATA_TYPE_STRING, "noreport");
134151
}
135152

136-
StringSetDestroy(time_classes);
153+
StringMapDestroy(time_classes);
137154
}
138155

139156
void UpdateTimeClasses(EvalContext *ctx, time_t t)

libenv/time_classes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* 'GMT_Yr2024', 'Hr15', 'Hr15_Q3', 'Lcycle_2', 'May', 'Min30_35',
4040
* 'Min33', 'Q3', 'Wednesday', 'Yr2024' }
4141
*/
42-
StringSet *GetTimeClasses(time_t time);
42+
StringMap *GetTimeClasses(time_t time);
4343

4444
void UpdateTimeClasses(EvalContext *ctx, time_t t);
4545

0 commit comments

Comments
 (0)