35#include <sys/tim_filter.h>
40 tf->cur_time_limit = time_len;
46 tf->cur_time_limit = time_len;
85 if ((fil_type != FILTER_TYPE_MIN) &&
86 (fil_type != FILTER_TYPE_MAX))
89 if (time_len < NUM_FILTER_ENTRIES)
92 if (fil_type == FILTER_TYPE_MIN)
93 set_val = 0xffffffffffffffff;
97 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
98 tf->entries[i].value = set_val;
99 tf->entries[i].time_up = 0;
101 tf->cur_time_limit = time_len;
116 if ((fil_type != FILTER_TYPE_MIN) &&
117 (fil_type != FILTER_TYPE_MAX))
120 if (time_len < NUM_FILTER_ENTRIES)
123 if (fil_type == FILTER_TYPE_MIN)
124 set_val = 0xffffffff;
128 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
129 tf->entries[i].value = set_val;
130 tf->entries[i].time_up = 0;
132 tf->cur_time_limit = time_len;
142 for(i=0; i<(NUM_FILTER_ENTRIES-1); i++) {
143 tim = now - tf->entries[i].time_up;
144 time_limit = (tf->cur_time_limit * (NUM_FILTER_ENTRIES-i))/NUM_FILTER_ENTRIES;
145 if (tim >= time_limit) {
147 for(j=(i+1); j<NUM_FILTER_ENTRIES; j++) {
148 if (tf->entries[i].time_up < tf->entries[j].time_up) {
149 tf->entries[i].value = tf->entries[j].value;
150 tf->entries[i].time_up = tf->entries[j].time_up;
157 tf->entries[i].value =
value;
158 tf->entries[i].time_up = now;
162 i = NUM_FILTER_ENTRIES-1;
163 tim = now - tf->entries[i].time_up;
164 time_limit = (tf->cur_time_limit * (NUM_FILTER_ENTRIES-i))/NUM_FILTER_ENTRIES;
165 if (tim >= time_limit) {
166 tf->entries[i].value =
value;
167 tf->entries[i].time_up = now;
177 for(i=0; i<(NUM_FILTER_ENTRIES-1); i++) {
178 tim = now - tf->entries[i].time_up;
179 time_limit = (tf->cur_time_limit * (NUM_FILTER_ENTRIES-i))/NUM_FILTER_ENTRIES;
180 if (tim >= time_limit) {
182 for(j=(i+1); j<NUM_FILTER_ENTRIES; j++) {
183 if (tf->entries[i].time_up < tf->entries[j].time_up) {
184 tf->entries[i].value = tf->entries[j].value;
185 tf->entries[i].time_up = tf->entries[j].time_up;
192 tf->entries[i].value =
value;
193 tf->entries[i].time_up = now;
197 i = NUM_FILTER_ENTRIES-1;
198 tim = now - tf->entries[i].time_up;
199 time_limit = (tf->cur_time_limit * (NUM_FILTER_ENTRIES-i))/NUM_FILTER_ENTRIES;
200 if (tim >= time_limit) {
201 tf->entries[i].value =
value;
202 tf->entries[i].time_up = now;
215 if (reduce_by < tf->entries[0].
value)
216 tf->entries[0].value -= reduce_by;
218 tf->entries[0].value = 0;
219 tf->entries[0].time_up = now;
220 for(i=1; i<NUM_FILTER_ENTRIES; i++) {
221 tf->entries[i].value = tf->entries[0].value;
222 tf->entries[i].time_up = now;
235 if (reduce_by < tf->entries[0].
value)
236 tf->entries[0].value -= reduce_by;
238 tf->entries[0].value = 0;
239 tf->entries[0].time_up = now;
240 for(i=1; i<NUM_FILTER_ENTRIES; i++) {
241 tf->entries[i].value = tf->entries[0].value;
242 tf->entries[i].time_up = now;
255 tf->entries[0].value += incr_by;
256 tf->entries[0].time_up = now;
257 for(i=1; i<NUM_FILTER_ENTRIES; i++) {
258 tf->entries[i].value = tf->entries[0].value;
259 tf->entries[i].time_up = now;
272 tf->entries[0].value += incr_by;
273 tf->entries[0].time_up = now;
274 for(i=1; i<NUM_FILTER_ENTRIES; i++) {
275 tf->entries[i].value = tf->entries[0].value;
276 tf->entries[i].time_up = now;
289 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
290 tf->entries[i].time_up += ticks_forward;
303 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
304 tf->entries[i].time_up += ticks_forward;
312 uint32_t tim, time_limit;
325 for(i=(NUM_FILTER_ENTRIES-2); i>=0 ; i--) {
326 tim = now - tf->entries[i].time_up;
327 time_limit = (tf->cur_time_limit * (NUM_FILTER_ENTRIES-i))/NUM_FILTER_ENTRIES;
328 if (tim >= time_limit) {
333 tf->entries[i].value = tf->entries[(i+1)].
value;
334 tf->entries[i].time_up = tf->entries[(i+1)].time_up;
343 uint32_t tim, time_limit;
356 for(i=(NUM_FILTER_ENTRIES-2); i>=0 ; i--) {
357 tim = now - tf->entries[i].time_up;
358 time_limit = (tf->cur_time_limit * (NUM_FILTER_ENTRIES-i))/NUM_FILTER_ENTRIES;
359 if (tim >= time_limit) {
364 tf->entries[i].value = tf->entries[(i+1)].
value;
365 tf->entries[i].time_up = tf->entries[(i+1)].time_up;
375 if (value <= tf->entries[0].
value) {
377 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
378 tf->entries[i].value =
value;
379 tf->entries[i].time_up = now;
381 return (tf->entries[0].value);
383 for (j=1; j<NUM_FILTER_ENTRIES; j++) {
384 if (value <= tf->entries[j].
value) {
385 for(i=j; i<NUM_FILTER_ENTRIES; i++) {
386 tf->entries[i].value =
value;
387 tf->entries[i].time_up = now;
393 return (tf->entries[0].value);
398 uint32_t
value, uint32_t now)
402 if (value <= tf->entries[0].
value) {
404 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
405 tf->entries[i].value =
value;
406 tf->entries[i].time_up = now;
408 return (tf->entries[0].value);
410 for (j=1; j<NUM_FILTER_ENTRIES; j++) {
411 if (value <= tf->entries[j].
value) {
412 for(i=j; i<NUM_FILTER_ENTRIES; i++) {
413 tf->entries[i].value =
value;
414 tf->entries[i].time_up = now;
420 return (tf->entries[0].value);
428 if (
value >= tf->entries[0].value) {
430 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
431 tf->entries[i].value =
value;
432 tf->entries[i].time_up = now;
434 return (tf->entries[0].value);
436 for (j=1; j<NUM_FILTER_ENTRIES; j++) {
437 if (
value >= tf->entries[j].value) {
438 for(i=j; i<NUM_FILTER_ENTRIES; i++) {
439 tf->entries[i].value =
value;
440 tf->entries[i].time_up = now;
446 return (tf->entries[0].value);
451 uint32_t
value, uint32_t now)
455 if (
value >= tf->entries[0].value) {
457 for(i=0; i<NUM_FILTER_ENTRIES; i++) {
458 tf->entries[i].value =
value;
459 tf->entries[i].time_up = now;
461 return (tf->entries[0].value);
463 for (j=1; j<NUM_FILTER_ENTRIES; j++) {
464 if (
value >= tf->entries[j].value) {
465 for(i=j; i<NUM_FILTER_ENTRIES; i++) {
466 tf->entries[i].value =
value;
467 tf->entries[i].time_up = now;
473 return (tf->entries[0].value);
void forward_filter_clock_small(struct time_filter_small *tf, uint32_t ticks_forward)
uint32_t apply_filter_max_small(struct time_filter_small *tf, uint32_t value, uint32_t now)
void filter_increase_by(struct time_filter *tf, uint64_t incr_by, uint32_t now)
void filter_increase_by_small(struct time_filter_small *tf, uint32_t incr_by, uint32_t now)
int setup_time_filter(struct time_filter *tf, int fil_type, uint32_t time_len)
void forward_filter_clock(struct time_filter *tf, uint32_t ticks_forward)
void reset_time(struct time_filter *tf, uint32_t time_len)
static void check_update_times(struct time_filter *tf, uint64_t value, uint32_t now)
void filter_reduce_by_small(struct time_filter_small *tf, uint32_t reduce_by, uint32_t now)
void tick_filter_clock_small(struct time_filter_small *tf, uint32_t now)
void reset_time_small(struct time_filter_small *tf, uint32_t time_len)
void filter_reduce_by(struct time_filter *tf, uint64_t reduce_by, uint32_t now)
uint32_t apply_filter_min(struct time_filter *tf, uint64_t value, uint32_t now)
int setup_time_filter_small(struct time_filter_small *tf, int fil_type, uint32_t time_len)
static void check_update_times_small(struct time_filter_small *tf, uint32_t value, uint32_t now)
void tick_filter_clock(struct time_filter *tf, uint32_t now)
uint32_t apply_filter_max(struct time_filter *tf, uint64_t value, uint32_t now)
uint32_t apply_filter_min_small(struct time_filter_small *tf, uint32_t value, uint32_t now)