|
|
View previous topic :: View next topic |
Author |
Message |
JAM2014
Joined: 24 Apr 2014 Posts: 138
|
Multi-part logic...... |
Posted: Mon Apr 16, 2018 4:22 pm |
|
|
Hi All,
I'm trying to code a test for dates that fall within a certain date range, but a simple & obvious method is defying me at the moment.
Let's suppose I want to find out if a specific date falls between two end point dates, say March 11th & Nov. 4th. I've been able to code a test that works for the beginning date or the end date separately, but I haven't been able to combine them into a working piece of code that tests both date limits! Argh!!!
Here is a test program that I'm trying to make work!
Code: |
#include <18F44K22.h>
#fuses INTRC_IO, NOWDT, PUT, NOLVP, NOPBADEN, FCMEN
#use delay(clock=8000000)
#define PWR_LED Pin_B1
#define Serial_TxD Pin_B4 // serial debug port
#use rs232(baud=9600, xmit=Serial_TxD, stream = Diag)
void main()
{
int8 iIndex;
signed int8 UTCOffset = 0;
unsigned int16 iMonth = 0;
unsigned int16 iDay = 0;
unsigned int8 iDayMax = 0;
// Here we turn off the Pwr LED
output_low(PWR_LED);
delay_ms(500);
// Here we blip the Power LED at power-up to show that the Lighting interface is working
for ( iIndex = 0 ; iIndex < 3 ; iIndex++ )
{
output_high(PWR_LED);
delay_ms(250);
output_low(PWR_LED);
delay_ms(250);
}
// Here we leave the Power LED ON
output_high(PWR_LED);
for (iMonth = 1; iMonth <= 12; iMonth++)
{
switch (iMonth)
{
Case 1:
Case 3:
Case 5:
Case 7:
Case 8:
Case 10:
Case 12:
iDayMax = 31;
break;
Case 2:
iDayMax = 28;
break;
Case 4:
Case 6:
Case 9:
Case 11:
iDayMax = 30;
break;
}
for (iDay = 1 ; iDay <= iDayMax ; iDay++)
{
//Here we do the UTC offset correction!
if (((((iMonth >= 3) && (iDay >= 11)) || (iMonth > 3))) && ((((iMonth <= 11) && (iDay <= 4)) || (iMonth < 11))))
UTCOffset = -4;
else
UTCOffset = -5;
fprintf(Diag, "Month: %Lu Day: %Lu UTCOffset: %d\n\r", iMonth, iDay, UTCOffset);
}
}
while(1){}
}
|
Any input on the proper test I need to be performing to make the this code work as intended?
Thanks!
Jack
Last edited by JAM2014 on Tue Apr 17, 2018 2:01 pm; edited 1 time in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Tue Apr 17, 2018 5:37 am |
|
|
Code: |
//function to decide if DST or EST
void dst_calc() {
if((rtcdow==0) && (rtcmth==3)&&(rtcday>=8)&&(rtcday<=16)&&(rtchrs==0)&&(rtcmin==0)&&(rtcsec==0)&&(dstflg==0))
{
rtchrs=rtchrs+1;
//ds3231_set_date_time(rtcyer,rtcmth,rtcday,rtcdow,rtchrs,rtcmin,rtcsec); //spring ahead !
dstflg=1;
lcd_gotoxy(15,2);
printf(lcd_putc,"DST");
//add rtc eeprom saving here !
}
else if ((rtcdow==0) && (rtcmth==11)&&(rtcday>=1)&&(rtcday<=8)&&(rtchrs==00)&&(rtcmin==0)&&(rtcsec==0)&&(dstflg==1))
{
rtchrs=rtchrs-1;
//ds3231_set_date_time(rtcyer,rtcmth,rtcday,rtcdow,rtchrs,rtcmin,rtcsec); //spring ahead !dstflg=0;
dstflg=0;
lcd_gotoxy(15,3);
printf(lcd_putc,"noDST");
//add rtc eeprom storing here !
} |
variables rtcxxx are the data from the rtc module,dtslfg is the daylight savings time flag.
OK, here's a quick cut and paste from my chickencoop project
It ain't pretty but I'll get back to it AFTER I get 'sunset' to be correct.
Got 18/4/13 to be correct( 20:00 instead of -4:00) by changing the 'loop' that put hrs within 0 to 24) but it fails around day 160ish..sunset at -3:00 !
Jay |
|
|
JAM2014
Joined: 24 Apr 2014 Posts: 138
|
|
Posted: Tue Apr 17, 2018 2:08 pm |
|
|
Hi All,
I needed to get away from this problem for a while to clear my head and be able to 'see the forest thru the trees'! Anyway, I've got the code working, and I've updated the original post with working code!
I haven't done much time/date arithmetic, but it always seems to be pretty gnarly!
Thanks,
Jack |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Tue Apr 17, 2018 7:25 pm |
|
|
yes, you can lose a LOT of sleep over 'time math' ! Back when RAM and EPROMs were pricey, I figured out how to store time in 1 byte. As long as you're OK with 15 minute 'intervals', you can do it in 7 bits, leaving a bit to be the 'control' bit to turn a device on or off. Being one byte makes 'time math' a lot easier and faster,especially when using PICs ! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|