Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: ICE-Application/src/Utilities/timerUtils.h
- Revision:
- 0:61364762ee0e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ICE-Application/src/Utilities/timerUtils.h Tue Jan 24 19:05:33 2017 +0000 @@ -0,0 +1,269 @@ +#ifndef __CNTL_TIME_SHEDULE_UTILS_H__ +#define __CNTL_TIME_SHEDULE_UTILS_H__ +/************************************************************************ + * * + * Copyright (c) 2012 Nalco Company. All Rights Reserved. * + * * + ************************************************************************/ + +#include <mbed.h> +#include "rtos.h" + +#ifdef __ICCARM__ +struct tm *localtime_r(const time_t *const timep, struct tm *result); +#endif + +typedef char DMSTRING32[32]; +typedef char DMSTRING128[128]; +typedef DMSTRING32 DM_TAG; + +#define ERROR -1 +#define OK 0 + +typedef enum cntl_check_schedule_returns +{ + CNTL_SCHED_CHECK_INTERNAL_ERROR = -3, // internal implementation error + CNTL_SCHED_CHECK_BAD_PARAMS = -2, // problem with the schedule data passed + CNTL_SCHED_CHECK_SCHED_OK = 0, // no problems or conflicts with the schedule + CNTL_SCHED_CHECK_OUTPUT_CONFLICT = 1, // conflict on output relay + CNTL_SCHED_CHECK_PRODUCT_CONFLICT = 2, // product conflict with another relay timer + CNTL_SCHED_CHECK_BLOWDOWN_CONFLICT = 3 // blowdown conflict with another relay timer +} CNTL_CHECK_SCHEDULE_RETURNS; + +#define CNTL_MAX_SCHEDULE_ELEMENTS 64 +#define TSC_ALARM_PRIORITY (90) /* Very high alarm priority so no other alarm can cancel it, i.e. interlock, maintenance mode, etc.*/ +#define TSC_12_HOURS_IN_SECONDS (SECONDS_PER_MINUTE * MINUTES_PER_HOUR * 12 ) +#define TSC_31_DAYS_IN_SECONDS (SECONDS_PER_MINUTE * MINUTES_PER_HOUR * HOURS_PER_DAY * 31) + + +#define SUNDAY_MASK (0x001) +#define MONDAY_MASK (0x002) +#define TUESDAY_MASK (0x004) +#define WEDNESDAY_MASK (0x008) +#define THURSDAY_MASK (0x010) +#define FRIDAY_MASK (0x020) +#define SATURDAY_MASK (0x040) +#define EVERY_DAY_MASK (0x080) +#define EVERY_WEEK_DAY_MASK (0x100) +#define SUN_TO_SAT_MASK (SUNDAY_MASK | MONDAY_MASK | TUESDAY_MASK | WEDNESDAY_MASK | THURSDAY_MASK | FRIDAY_MASK | SATURDAY_MASK) + +typedef struct +{ + int days; + int hours; + int minutes; + int seconds; +} UTtimeInterval; + +/* + * A general date and time struct + */ +typedef struct +{ + int hour; + int minute; + int day; + int month; + int year; +} UT_DATE_TIME; + +typedef struct cntl_date_struct +{ + unsigned long month; + unsigned long day; + unsigned long year; +} CNTL_DATE_STRUCT; + +typedef struct cntl_hr_min_struct +{ + unsigned long hour; + unsigned long minute; + unsigned long second; +} CNTL_HR_MIN_STRUCT; + +#define SECONDS_PER_MINUTE (60) +#define MINUTES_PER_HOUR (60) +#define HOURS_PER_DAY (24) +#define DAYS_PER_WEEK (7) +#define DAYS_PER_YEAR (365) +#define HOURS_PER_WEEK (HOURS_PER_DAY * DAYS_PER_WEEK) +#define MINUTES_PER_DAY (MINUTES_PER_HOUR * HOURS_PER_DAY) +#define MINUTES_PER_WEEK (MINUTES_PER_HOUR * HOURS_PER_WEEK) +#define SECONDS_PER_HOUR (SECONDS_PER_MINUTE*MINUTES_PER_HOUR) +#define SECONDS_PER_DAY (SECONDS_PER_HOUR*HOURS_PER_DAY) +#define SECONDS_PER_WEEK (SECONDS_PER_HOUR*HOURS_PER_WEEK) + + +#define CNTL_SUNDAY_MASK (0x01) +#define CNTL_MONDAY_MASK (0x02) +#define CNTL_TUESDAY_MASK (0x04) +#define CNTL_WEDNESDAY_MASK (0x08) +#define CNTL_THURSDAY_MASK (0x10) +#define CNTL_FRIDAY_MASK (0x20) +#define CNTL_SATURDAY_MASK (0x40) +#define CNTL_SUN_TO_SAT_MASK (CNTL_SUNDAY_MASK | CNTL_MONDAY_MASK | CNTL_TUESDAY_MASK | CNTL_WEDNESDAY_MASK | CNTL_THURSDAY_MASK | CNTL_FRIDAY_MASK | CNTL_SATURDAY_MASK) +#define CNTL_WEEKDAY_MASK (CNTL_MONDAY_MASK | CNTL_TUESDAY_MASK | CNTL_WEDNESDAY_MASK | CNTL_THURSDAY_MASK | CNTL_FRIDAY_MASK) + +typedef enum +{ + DAY_SCHEDULE_NOT_SPECIFIED = 0x00, + DAY_SCHEDULE_SUNDAY_MASK = 0x01, + DAY_SCHEDULE_MONDAY_MASK = 0x02, + DAY_SCHEDULE_TUESDAY_MASK = 0x04, + DAY_SCHEDULE_WEDNESDAY_MASK = 0x08, + DAY_SCHEDULE_THURSDAY_MASK = 0x10, + DAY_SCHEDULE_FRIDAY_MASK = 0x20, + DAY_SCHEDULE_SATURDAY_MASK = 0x40, + DAY_SCHEDULE_WEEKDAY_MASK = ( DAY_SCHEDULE_MONDAY_MASK | DAY_SCHEDULE_TUESDAY_MASK | DAY_SCHEDULE_WEDNESDAY_MASK | DAY_SCHEDULE_THURSDAY_MASK | DAY_SCHEDULE_FRIDAY_MASK ), + DAY_SCHEDULE_SAT_TO_SUN_MASK = ( DAY_SCHEDULE_SUNDAY_MASK | DAY_SCHEDULE_WEEKDAY_MASK | DAY_SCHEDULE_SATURDAY_MASK ) +} DAY_SCHEDULE; + +typedef enum +{ + WEEKLY_CHOICE_EVERY_WEEK = 0, + WEEKLY_CHOICE_FIRST_WEEK = 1, + WEEKLY_CHOICE_SECOND_WEEK = 2, + WEEKLY_CHOICE_THIRD_WEEK = 3, + WEEKLY_CHOICE_FOURTH_WEEK = 4, + WEEKLY_CHOICE_LAST_WEEK = 5, + WEEKLY_CHOICE_EVERYOTHER_WEEK = 6, + WEEKLY_CHOICE_NOT_SPECIFIED = 7 +} WEEKLY_CHOICES; + + +typedef enum cntl_days_of_wk +{ + SUNDAY = 0, + MONDAY = 1, + TUESDAY = 2, + WEDNESDAY = 3, + THURSDAY = 4, + FRIDAY = 5, + SATURDAY = 6 +} CNTL_DAYS_OF_WK; + +/* + * CNLT_SCHED_STRUCT contains everything needed to specify a schedule + */ +typedef struct cntl_sched_struct +{ + CNTL_DATE_STRUCT startDate; // always valid, mm/dd/yyyy when schedule starts all schedules have a startDate + CNTL_HR_MIN_STRUCT startTime; // always valid, hour and minute when output is activated, all schedules have startTime + CNTL_HR_MIN_STRUCT endTime; // always valid, hour and minute when output is activation stops, all schedules have stopTime + WEEKLY_CHOICES weeklySchedule; // default is EVERY + unsigned char dailySchedule; // default is the current day of the week +} CNTL_SCHED_STRUCT; + +typedef struct +{ + CNTL_SCHED_STRUCT schedule; /* the schedule */ + time_t calTime; /* time in seconds passed to localtime to populate the requestTime structure */ + struct tm requestTime; /* the broken down time when the request was made, used to determine the initial starting date */ + unsigned long outputDuty; /* scaled output duty 3 digits 1 decimal 0 <= outputDuty <= 1000 */ + bool preBleedorLockout; /* the timer specifies preBleed or lockout */ +} TSC_SCHED_ELEM; + +#define TSC_NULL_INSTANCE (-1) + +/* + * To be deprecated + */ +typedef enum +{ + TSC_UTIL_ONE_OUTPUT = 1, + TSC_UTIL_ALL_OUTPUTS = 2, +} TSC_UTIL_OUTPUT_CHECK; + +/* + * Tell the general checking function what to look for + */ +typedef enum +{ + TSC_UTIL_THEOUTPUT_CHECK, + TSC_UTIL_BLOWDOWN_CHECK, + TSC_UTIL_OXNONOX_CHECK +} TSC_UTIL_WHAT_TO_CHECK; + +/* + * The attribute to look for when filtering the list of timer schedules + * it's up to the pruning filter functions to include or exclude based upon the + * pruning attribute + */ +typedef enum +{ + TSC_UTIL_PRUNE_PRODUCTS = 1, + TSC_UTIL_PRUNE_BLOWDOWN = 2 +} TSC_UTIL_PRUNE_ATTRIBUTE; + +/* + * attribute indicates if a timer scheduling is for the first time or a reschedule + */ +typedef enum +{ + TSC_INITIAL_SCHEDULE, + TSC_RESCHEDULE +} TSC_UTIL_SCHED_STATE; + +typedef enum tsc_sched_miss_reason +{ + TSC_SCHEDULE_NOT_MISSED, + TSC_SCHEDULE_MISSED, + TSC_SCHEDULE_INTERRUPTED +} TSC_SCHED_MISS_REASON; + + +/* + * renamed utility functions replacing CNTL_xyz functions + */ + +void TSCutilScheduleWithInWeek( TSC_SCHED_ELEM *pSchedElem ); +void TSCutilPreviousScheduleWithInWeek( TSC_SCHED_ELEM *pSchedElem ); +void TSCutilComputeStartDate( TSC_SCHED_ELEM *pSchedElem ); +void TSCutilScheduleOneWeekPerMonth( TSC_SCHED_ELEM *pSchedElem ); +void TSCutilInitFreeLists(); +bool TSCutilWasPreviousScheduleInterrupted( CNTL_SCHED_STRUCT *pElem, TSC_SCHED_MISS_REASON *pReason, unsigned long create_time_stamp, int *pmiss_count, int *pstart_to_end_diff ); +int TSCgetCreateTime( DM_TAG relay, unsigned long starting_hour, unsigned long starting_minute, unsigned long *create_time ); +int TSCnewComputeWaitTimer( CNTL_SCHED_STRUCT *pSchedule, TSC_UTIL_SCHED_STATE scheduleingState, TSC_SCHED_ELEM *pNowTimeDate, unsigned long *pDiffInSeconds ); +bool TSCIsTimerSchedLT12Hr( unsigned long *pGo_Off, DMSTRING32 id_info ); + +int TSCutilLoadSchedules(); +int TSCutilAddElemToScheduleList( TSC_SCHED_ELEM *pElem ); +int TSCutilPutFreeSchedElem( TSC_SCHED_ELEM *pElem ); + + +int TSCutilDeleteSchedElem( TSC_SCHED_ELEM *pElem ); + +TSC_SCHED_ELEM *TSCutilGetFreeSchedElem( ); +TSC_SCHED_ELEM *TSCutilGetFirstSchedule(); +TSC_SCHED_ELEM *TSCutilGetNextSchedule( TSC_SCHED_ELEM *pElem ); + +int TSCutilgetScheduleCount(); +int TSCutilCmpStartTimes( TSC_SCHED_ELEM *pNewElem, TSC_SCHED_ELEM *pListElem ); + +bool TSCutilDoesScheduleConflict( TSC_SCHED_ELEM *pNewElem, TSC_UTIL_OUTPUT_CHECK which_check ); + + + +int Util_addTupleToTimeControl( int instance, TSC_SCHED_ELEM *pElem ); +int Util_addTupleToRLcontrol( int instance, TSC_SCHED_ELEM *pElem, DM_TAG keyTag ); +int Util_dateTimeDiff( CNTL_SCHED_STRUCT *pDateTime1, CNTL_SCHED_STRUCT *pDateTime2, unsigned long *pDiffInSeconds ); + + +void Util_displayStartDateTime( CNTL_SCHED_STRUCT *pTimeStruct ); +void Util_displayWeeklySchedule( CNTL_SCHED_STRUCT *pTimeStruct ); +void Util_displayDailySchedule( CNTL_SCHED_STRUCT *pTimeStruct ); + +int Util_getDayOfWeek( TSC_SCHED_ELEM *pSchedElem, CNTL_DATE_STRUCT *pDate ); +int Util_getMonthWeek( TSC_SCHED_ELEM *pSchedElem, CNTL_DATE_STRUCT *pDate ); +int Util_findAday( int startingDay, unsigned char dailySchedule ); +int Util_getDoWThisMonth( TSC_SCHED_ELEM *pSchedElem, int dom ); +int Util_numDaysInSchedule( unsigned char dailySchedule ); + +char *Util_getDailyScheduleString( CNTL_SCHED_STRUCT *pTimeStruct ); +char *Util_getWeeklyScheduleString( CNTL_SCHED_STRUCT *pTimeStruct); +char *Util_getDayString( int dayOfWeek ); + +int TSCgetNumericSuffix(char* input); +char * TSCinterruptReasonToString( TSC_SCHED_MISS_REASON reason ); + +#endif