Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

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