an iCal processing library
Diff: iCal.h
- Revision:
- 0:49245357cd1b
- Child:
- 1:db274b9e40cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iCal.h Sun Apr 20 13:25:50 2014 +0000 @@ -0,0 +1,164 @@ + + + +#ifndef ICAL_H +#define ICAL_H +#include "mbed.h" + +#include "NTPClient.h" + +// This defines the total number of events that can be handled - kind of limiting +// but maybe ok for now. +#define EVENT_COUNT 10 + + +// Maximum storage space for each item as free-form text +#define SUMMARY_CHARS 40 +#define LOCATION_CHARS 30 +#define CATEGORY_CHARS 30 + +typedef enum { + rptfNone, + rptfDaily, + rptfWeekly, + rptfMonthly, + rptfYearly +} RepeatFreq_t; + +#if 0 +typedef enum { + Sunday = 0x01, + Monday = 0x02, + Tuesday = 0x04, + Wednesday = 0x08, + Thursday = 0x10, + Friday = 0x20, + Saturday = 0x40 +} RepeatDays_t; +#endif + +typedef struct { + time_t Start; + time_t End; + time_t Until; + uint16_t Count; + uint16_t Interval; + RepeatFreq_t RepeatFreq; + uint8_t RepeatDays; // bit mapped (bit 0 = sunday, bit 1=monday, ... + char Summary[SUMMARY_CHARS]; + char Location[LOCATION_CHARS]; + char Category[CATEGORY_CHARS]; // "Green", ... + int Priority; // 1 == High, 5 == Normal, 9 == Low +} Event_T; + + +extern Event_T EventList[EVENT_COUNT]; + +/// Format a ctime value as a string, without the trailing <cr> +/// +/// This uses the normal ctime function, which appends a <cr>, but +/// it then removes that trailing line ending character. Additionally, +/// this keeps a few local static buffers to return the time string in +/// which permits a printf (for example) to call this api a few times +/// and get the proper representation of each. +/// +/// @param t is a time value; +/// @returns a pointer to a static buffer containing the converted time. +/// +char * FormatCTime(time_t t); + +/// Sort the Events that have been extracted from the iCal results. +/// +void SortEvents(); + +/// Show the details for a specific Event, on the specified serial stream. +/// +/// Most usefor during development, and perhaps no value after that. +/// +/// @param Event is the event of interest. +/// +void ShowEventInfo(Event_T & Event); + +/// Access the 2-letter abbreviation for the day of the week. +/// +/// @param i is the day of the week, where 0 = sunday +/// @returns a pointer to the 2-letter abbreviation. +/// +const char * RepeatDayAbbrev(int i); + +/// Get the number of events that have been cached. +/// +/// @returns the number of events. +/// +int GetNumEvents(void); + +/// Parse a Datestamp string into a time value. +/// +/// Parses a string which can look like this: 20140505T200000 +/// into a time_t value. +/// +/// @param string is the string to parse. +/// @param ntp is a reference to an NTPClient object, in order +/// to get the time-zone offset. +/// @returns time_t value. +/// +time_t ParseDateStamp(char * string, NTPClient & ntp); + +/// Parse an iCal stream, and extract everything useful. +/// +/// This accepts a pointer to a [large] buffer, which is the contents +/// of an iCal stream. It walked through all of the available +/// information to extract the Event list. +/// +/// @param pStart is a pointer to the start of the stream. +/// @param gridStartTime is a time value representing the start of the time-window of interest. +/// This permits +/// @param gridEndTime is a time value representing the end of the time-window of interest. +/// @param ntp is a reference to an NTPClient object, in order +/// to get the time-zone offset. +/// +void ParseICalStream(char * pStart, time_t gridStartTime, time_t gridEndTime, NTPClient & ntp); + +/// Compute the intersection of two time ranges, and returns that intersection. +/// +/// This compares a pair of time ranges, each by a start and end time. If they overlap +/// it then computes the intersection of those two ranges. +/// +/// @param start1 is the starting time of range 1. +/// @param end1 is the ending time of range 1. +/// @param start2 is the starting time of range 2. +/// @param end2 is the ending time of range 2. +/// @returns true if the ranges overlap, and then start1 and end1 are set to the +/// intersection. +/// +bool TimeIntersects(time_t * start1, time_t * end1, time_t * start2, time_t * end2); + +/// Computes the next interval for iCal events that have recurrence. +/// +/// @param repeatFreq is a value representing the frequency of recurrence - +/// 0=none, 1=daily, 2=weekly, 3=monthly, 4=yearly +/// @param interval is the multiplier of that repeat frequency to the next +/// event. +/// @returns a time_t value which is the incremental interval, and would be added +/// to a reference time. +/// +time_t NextInterval(int repeatFreq, int interval); + +/// Compute the intersection of two time ranges, and evaluate the recurringing events. +/// +/// This compares a pair of time ranges, each by a start and end time. If they overlap +/// it then computes the intersection of those two ranges. Additionally, for a +/// specified Event, it will evaluate the recurring events that may also fall into +/// the target time range. +/// +/// @param start1 is the starting time of range 1. +/// @param end1 is the ending time of range 1. +/// @param start2 is the starting time of range 2. +/// @param end2 is the ending time of range 2. +/// @param Event is the event of interest that may have recurring series. +/// @returns true if the ranges overlap, and then start1 and end1 are set to the +/// intersection. +/// +bool RepeatIntersects(time_t * start1, time_t * end1, time_t * start2, time_t * end2, Event_T & Event); + +#endif // ICAL_H \ No newline at end of file