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.
ICE-Application/src/Utilities/timerUtils.h
- Committer:
- jmarkel44
- Date:
- 2017-01-24
- Revision:
- 0:61364762ee0e
File content as of revision 0:61364762ee0e:
#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