Example #1
0
void RestoreModePowerOn(void)
{
    ST_BALANCEDAY_POWERON_BUFFER_PARAM stBanlancePower[CON_HISTORY_POWER_COUNT_MAX+1];
    UN_BALANCEDAY_TYPE_PARAM ucBanlanceDayBuffer[CON_BALANCE_DAY_NUM_MAX+1];
    // uchar ucBanlanceEnable[CON_BALANCE_DAY_NUM_MAX];
    uchar ucBalanceDayNum,ucBalanceDayNumEveryMonth;
    uchar ucTemp,ucDay,ucHour,ucTempMove,ucTempAdd;
    uchar ucCanWhile;
    uchar ucBalanceDayPoint,ucBalanceDayCount;
    u16 uiTempData;
    ulong ulStart,ulEnd,ulTem;
    uchar ucTimeBuffer[3];
    uchar ucRestorLastSave[8];
    ucBalanceDayNum = PROGFUNCTION_COEF_BALANCE_DAY_NUM;
    if(ucBalanceDayNum>CON_BALANCE_DAY_NUM_MAX)
        ucBalanceDayNum=3;

    memset(&(ucBanlanceDayBuffer[0].ucStart), 0x00, 31*2);
    ucBalanceDayNumEveryMonth=0;
    if(0==ReadDataDirect(EPL_RESTOREPOWER_LASTTIME, sizeof(ucRestorLastSave), &Wr_data[0]))
    {
        memcpy(&ucRestorLastSave[0], &ucTimeLastSave[0], sizeof(ucRestorLastSave));
    }
    else
    {
        ucRestorLastSave[0]=0x30;   // second
        ucRestorLastSave[1]=Wr_data[0]; // minute
        ucRestorLastSave[2]=Wr_data[1]; // hour
        ucRestorLastSave[3]=0;  // week
        ucRestorLastSave[4]=Wr_data[2]; // day
        ucRestorLastSave[5]=Wr_data[3]; // month
        ucRestorLastSave[6]=Wr_data[4]; // year
    }
    // AA 下面内容重新排序抄表日以及统计总的抄表日数目  AA
    if(0!=ucBalanceDayNum)
    {
        // AA 结算日数据按照时间从大到小排序   AA
        // AA 如果是同一日的数据,则按照小时排序   AA
        // AA 如果有相同的结算日数据,则只取其中的一个   AA
        // AA 如果时间日期时间不合法,则不统计这个数据   AA
        for(ucTemp=0; ucTemp<ucBalanceDayNum; ucTemp++)
        {
            ucDay=RAM[RAM_BALANCE_DAY_01+ucTemp*2+1];
            ucHour=RAM[RAM_BALANCE_DAY_01+ucTemp*2+0];
            if(2==TestDay(ucDay)+TestHour(ucHour))
                //  AA   数据判断条件,满足条件才处理   AA
            {
                if(0 != ucBalanceDayNumEveryMonth)
                {
                    for(ucTempAdd=0; ucTempAdd<ucBalanceDayNum; ucTempAdd++)
                    {
                        uiTempData=ucDay;
                        uiTempData=(uiTempData<<8)+ucHour;
                        // AA 如果相等---> 则不需要增加----AA
                        if(uiTempData == ucBanlanceDayBuffer[ucTempAdd].uiDataCode)
                        {
                            ucTempAdd=ucBalanceDayNum;
                        }
                        else
                        {
                            // AA  数据小,则增加 AA
                            if(uiTempData > ucBanlanceDayBuffer[ucTempAdd].uiDataCode)
                            {
                                // AA   移动数据 AA
                                for(ucTempMove=(ucBalanceDayNum); ucTempMove>ucTempAdd; ucTempMove--)
                                {
                                    ucBanlanceDayBuffer[ucTempMove].uiDataCode = ucBanlanceDayBuffer[ucTempMove-1].uiDataCode;
                                }
                                // AA  添加数据 AA
                                ucBanlanceDayBuffer[ucTempAdd].uiDataCode=uiTempData;

                                ucBalanceDayNumEveryMonth++;
                                ucBanlanceDayBuffer[ucBalanceDayNumEveryMonth].uiDataCode=0x0000;
                                ucTempAdd=ucBalanceDayNum; // break;
                            }
                            // AA  数据大,则跳过   AA
                            else
                            {
                                ;// no do
                            }
                        }
                    }
                }
                else
                {
                    ucBanlanceDayBuffer[0].uInChar.ucDay=ucDay;
                    ucBanlanceDayBuffer[0].uInChar.ucHour=ucHour;
                    ucBalanceDayNumEveryMonth++;
                }
            }
        }
    }


    ucCanWhile=GAL_NO;
    if(ucBalanceDayNumEveryMonth>0)
    {
        ucCanWhile=GAL_YES;
    }
    // AA  停电时间读取正确  AA
//  if(0==ReadDataDirect(EPL_SOFT_SECOND, 7, &ucRestorLastSave[0]))
//  {
//      ucCanWhile=GAL_NO;
//  }
    // AA  停电时间数据格式正确  AA
//  if(0==TestSecondMinuteHourDayMonthYear(&ucRestorLastSave[0], &ucRestorLastSave[4]))
//  {
//      ucCanWhile=GAL_NO;
//  }
    // AA 当前时间和停电时间差正确---当前时间应该大于停电时间   AA
    ulEnd=RSOFT_RTC_YEAR;
    ulEnd=(ulEnd<<8) + RSOFT_RTC_MONTH;
    ulEnd=(ulEnd<<8) + RSOFT_RTC_DAY;
//  ulEnd=(ulEnd<<8) + RSOFT_RTC_HOUR;
    ulStart=ucRestorLastSave[6];    // year
    ulStart=(ulStart<<8) + ucRestorLastSave[5];// month
    ulStart=(ulStart<<8) + ucRestorLastSave[4];// day
//  ulStart=(ulStart<<8) + ucRestorLastSave[2];// hour
    if(ulEnd<ulStart)
    {
        ucCanWhile=GAL_NO;
    }
    else
    {
        if(ulEnd==ulStart)
        {
            if(RSOFT_RTC_HOUR<=ucRestorLastSave[2])
            {
                ucCanWhile=GAL_NO;
            }
        }
    }
    ucBalanceDayCount=0;
    if(GAL_YES == ucCanWhile)
    {
        ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1;
        ucTimeBuffer[0]=RSOFT_RTC_DAY;
        ucTimeBuffer[1]=RSOFT_RTC_MONTH;
        ucTimeBuffer[2]=RSOFT_RTC_YEAR;
        // AA  开始追溯最近的结算时间  AA
        // AA  追溯的长度由 CON_HISTORY_POWER_COUNT_MAX 决定,基本上为12次  AA
        // AA  追溯的结果数据保存在stBanlancePower 中,这样方便后续处理  AA
        // AA  追溯过程分成当前日,之前日等处理。  AA

        // AA  查找今天是否有计算数据  AA
        for(ucTemp=0; ucTemp<ucBalanceDayNumEveryMonth; ucTemp++)
        {
            ucHour=ucBanlanceDayBuffer[ucTemp].uInChar.ucHour;
            if((ucBanlanceDayBuffer[ucTemp].uInChar.ucDay==ucTimeBuffer[0])
                    &&(ucHour<=RSOFT_RTC_HOUR))
            {
                // AA  增加一条记录  AA---------->Start
                if(ucBalanceDayCount<CON_HISTORY_POWER_COUNT_MAX)
                {
                    stBanlancePower[ucBalanceDayPoint].ucHour=ucHour;
                    stBanlancePower[ucBalanceDayPoint].ucDay=ucTimeBuffer[0];
                    stBanlancePower[ucBalanceDayPoint].ucMonth=ucTimeBuffer[1];
                    stBanlancePower[ucBalanceDayPoint].ucYear=ucTimeBuffer[2];
                    ucBalanceDayCount++;
                    if(ucBalanceDayPoint>0)
                    {
                        ucBalanceDayPoint--;
                    }
                }
                if(ucBalanceDayCount>=CON_HISTORY_POWER_COUNT_MAX)
                {
                    ucTemp=ucBalanceDayNumEveryMonth;
                    ucCanWhile=GAL_NO;
                }
                // AA  增加一条记录  AA---------->end
            }
        }
        while(GAL_YES==ucCanWhile)
        {
            PerDayFromPoint(&ucTimeBuffer[0]);
            ulEnd=ucTimeBuffer[2];
            ulEnd=(ulEnd<<8) + ucTimeBuffer[1];
            ulEnd=(ulEnd<<8) + ucTimeBuffer[0];
            if(ulStart<ulEnd)
                //AA 查找之前的日子是否有计算数据  AA
            {
                for(ucTemp=0; ucTemp<ucBalanceDayNumEveryMonth; ucTemp++)
                {
                    ucHour=ucBanlanceDayBuffer[ucTemp].uInChar.ucHour;
                    if((ucBanlanceDayBuffer[ucTemp].uInChar.ucDay==ucTimeBuffer[0]))
                    {
                        // AA  增加一条记录  AA---------->Start
                        if(ucBalanceDayCount<CON_HISTORY_POWER_COUNT_MAX)
                        {
                            stBanlancePower[ucBalanceDayPoint].ucHour=ucHour;
                            stBanlancePower[ucBalanceDayPoint].ucDay=ucTimeBuffer[0];
                            stBanlancePower[ucBalanceDayPoint].ucMonth=ucTimeBuffer[1];
                            stBanlancePower[ucBalanceDayPoint].ucYear=ucTimeBuffer[2];
                            ucBalanceDayCount++;
                            if(ucBalanceDayPoint>0)
                            {
                                ucBalanceDayPoint--;
                            }
                        }
                        else
                        {
                            ucTemp=ucBalanceDayNumEveryMonth;
                            ucCanWhile=GAL_NO;
                        }
                        // AA  增加一条记录  AA---------->end
                    }
                }
            }
            else
            {
                if(ulStart==ulEnd)
                    // AA 超找停电日是否有计算数据 AA
                {
                    for(ucTemp=0; ucTemp<ucBalanceDayNumEveryMonth; ucTemp++)
                    {
                        ucHour=ucBanlanceDayBuffer[ucTemp].uInChar.ucHour;
                        if((ucBanlanceDayBuffer[ucTemp].uInChar.ucDay==ucTimeBuffer[0])
                                &&(ucHour > ucRestorLastSave[2]))
                        {
                            // AA  增加一条记录  AA---------->Start
                            if(ucBalanceDayCount<CON_HISTORY_POWER_COUNT_MAX)
                            {
                                stBanlancePower[ucBalanceDayPoint].ucHour=ucHour;
                                stBanlancePower[ucBalanceDayPoint].ucDay=ucTimeBuffer[0];
                                stBanlancePower[ucBalanceDayPoint].ucMonth=ucTimeBuffer[1];
                                stBanlancePower[ucBalanceDayPoint].ucYear=ucTimeBuffer[2];
                                ucBalanceDayCount++;
                                if(ucBalanceDayPoint>0)
                                {
                                    ucBalanceDayPoint--;
                                }
                            }
                            else
                            {
                                ucTemp=ucBalanceDayNumEveryMonth;
                                ucCanWhile=GAL_NO;
                            }
                            // AA  增加一条记录  AA---------->end
                        }
                    }
                }
                else
                {
                    ucCanWhile=GAL_NO;
                }
            }
        }

    }

    if(ucBalanceDayCount>0)
    {
        // AA  发现需要结算数据  AA
        // AA 开始转存数据AA
        ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1;
        for(ucTemp=0; ucTemp<ucBalanceDayCount; ucTemp++)
        {
            if(ucBalanceDayPoint>=CON_HISTORY_POWER_COUNT_MAX)
                // AA 防止异常错误 AA
            {
                ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1;
            }

            // AA 结算需量数据 AA
            memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4);
            Wr_data[0]=0x00;
            RestoreDemand(&Wr_data[0]);
            if(0==ucTemp)
            {
                // AA 只有在第一次的时候,才清除当前需量 AA
                DemandDataClrAllCurrent();
            }
            // AA 结算电量数据 AA
            memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4);
            Wr_data[0]=0x00;
            RestorePower(&Wr_data[0]);
            // AA 结算用电量数据 AA
            memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4);
            Wr_data[0]=0x00;
            RestorePowerUse(&Wr_data[0]);
            ucBalanceDayPoint--;
        }
        ucBalanceDayPoint=CON_HISTORY_POWER_COUNT_MAX-1;
        memcpy(&Wr_data[1], &stBanlancePower[ucBalanceDayPoint].ucHour, 4);
        Wr_data[0]=0x00;
        WriteDataDirect(&Wr_data[0], EPL_RESTOREDEMAND_LASTTIME, 5);
        WriteDataDirect(&Wr_data[0], EPL_RESTOREPOWER_LASTTIME, 5);
        WriteDataDirect(&Wr_data[0], EPL_RESTOREPOWERUSE_LASTTIME, 5);
    }

// 电压监控数据的补结算
    if(0==ReadDataDirect(EPL_RESTOREMONITER_LASTTIME, sizeof(ucRestorLastSave), &Wr_data[0]))
    {
        memcpy(&ucRestorLastSave[0], &ucTimeLastSave[0], sizeof(ucRestorLastSave));
    }
    else
    {
        ucRestorLastSave[0]=0x30;   // second
        ucRestorLastSave[1]=Wr_data[0]; // minute
        ucRestorLastSave[2]=Wr_data[1]; // hour
        ucRestorLastSave[3]=0;  // week
        ucRestorLastSave[4]=Wr_data[2]; // day
        ucRestorLastSave[5]=Wr_data[3]; // month
        ucRestorLastSave[6]=Wr_data[4]; // year
    }
    ulEnd=ValueHexFromBcd(RSOFT_RTC_YEAR);
    ulEnd=ulEnd*12 + ValueHexFromBcd(RSOFT_RTC_MONTH);
    ulStart=ValueHexFromBcd(ucRestorLastSave[6]);
    ulStart=ulStart*12 + ValueHexFromBcd(ucRestorLastSave[5]);

    if(ulStart<ulEnd)
    {
        ulTem=ulEnd-ulStart;
        if(ulTem>=CON_HISTORY_MONITER_COUNT_MAX)
        {
            ulStart=ulEnd-CON_HISTORY_MONITER_COUNT_MAX;
        }
        for(ucTemp=0; ucTemp<CON_HISTORY_MONITER_COUNT_MAX; ucTemp++)
        {
            ulStart++;
            if(ulStart>ulEnd)
            {
                ucTemp=CON_HISTORY_MONITER_COUNT_MAX;
            }
            else
            {
                Wr_data[0]=0x00;
                Wr_data[1]=0x00;
                Wr_data[2]=0x01;
                Wr_data[3]=ValueBcdFromHex(ulStart%12);
                if(0==Wr_data[3])
                {
                    Wr_data[3]=0x12;
                    // AA 前面ulStart 已经增加过了,保证是一个大于0 的数字 AA AA
                    Wr_data[4]=ValueBcdFromHex((ulStart-1)/12);
                }
                else
                {
                    Wr_data[4]=ValueBcdFromHex(ulStart/12);
                }
                RestoreMoniter(&Wr_data[0]);
                if(0==ucTemp)
                {
                    RestoreMoniterClr();
                }

            }
        }

    }

}
Example #2
0
bool FDateTimeTest::RunTest( const FString& Parameters )
{
	const int32 UnixEpochTimestamp = 0;
	const int32 UnixBillenniumTimestamp = 1000000000;
	const int32 UnixOnesTimestamp = 1111111111;
	const int32 UnixDecimalSequenceTimestamp = 1234567890;

	const FDateTime UnixEpoch = FDateTime::FromUnixTimestamp(UnixEpochTimestamp);
	const FDateTime UnixBillennium = FDateTime::FromUnixTimestamp(UnixBillenniumTimestamp);
	const FDateTime UnixOnes = FDateTime::FromUnixTimestamp(UnixOnesTimestamp);
	const FDateTime UnixDecimalSequence = FDateTime::FromUnixTimestamp(UnixDecimalSequenceTimestamp);

	const FDateTime TestDateTime(2013, 8, 14, 12, 34, 56, 789);
	
#define TestUnixEquivalent( Desc, A, B ) if( (A).ToUnixTimestamp() != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A).ToUnixTimestamp(),(B)));

	TestUnixEquivalent( TEXT("Testing Unix Epoch Ticks"), UnixEpoch, UnixEpochTimestamp);
	TestUnixEquivalent( TEXT("Testing Unix Billennium Ticks"), UnixBillennium, UnixBillenniumTimestamp);
	TestUnixEquivalent( TEXT("Testing Unix Ones Ticks"), UnixOnes, UnixOnesTimestamp);
	TestUnixEquivalent( TEXT("Testing Unix Decimal Sequence Ticks"), UnixDecimalSequence, UnixDecimalSequenceTimestamp);

#undef TestUnixEquivalent

#define TestYear( Desc, A, B ) if( (A.GetYear()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetYear()),(B)));
#define TestMonth( Desc, A, B ) if( (A.GetMonth()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetMonth()),static_cast<int32>(B)));
#define TestDay( Desc, A, B ) if( (A.GetDay()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetDay()),(B)));
#define TestHour( Desc, A, B ) if( (A.GetHour()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetHour()),(B)));
#define TestMinute( Desc, A, B ) if( (A.GetMinute()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetMinute()),(B)));
#define TestSecond( Desc, A, B ) if( (A.GetSecond()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetSecond()),(B)));
#define TestMillisecond( Desc, A, B ) if( (A.GetMillisecond()) != (B) ) AddError(FString::Printf(TEXT("%s - A=%d B=%d"),Desc,(A.GetMillisecond()),(B)));

	TestYear( TEXT("Testing Unix Epoch Year"), UnixEpoch, 1970 );
	TestMonth( TEXT("Testing Unix Epoch Month"), UnixEpoch, EMonthOfYear::January );
	TestDay( TEXT("Testing Unix Epoch Day"), UnixEpoch, 1 );
	TestHour( TEXT("Testing Unix Epoch Hour"), UnixEpoch, 0 );
	TestMinute( TEXT("Testing Unix Epoch Minute"), UnixEpoch, 0 );
	TestSecond( TEXT("Testing Unix Epoch Second"), UnixEpoch, 0 );
	TestMillisecond( TEXT("Testing Unix Epoch Millisecond"), UnixEpoch, 0 );

	TestYear( TEXT("Testing Unix Billennium Year"), UnixBillennium, 2001 );
	TestMonth( TEXT("Testing Unix Billennium Month"), UnixBillennium, EMonthOfYear::September );
	TestDay( TEXT("Testing Unix Billennium Day"), UnixBillennium, 9 );
	TestHour( TEXT("Testing Unix Billennium Hour"), UnixBillennium, 1 );
	TestMinute( TEXT("Testing Unix Billennium Minute"), UnixBillennium, 46 );
	TestSecond( TEXT("Testing Unix Billennium Second"), UnixBillennium, 40 );
	TestMillisecond( TEXT("Testing Unix Billennium Millisecond"), UnixBillennium, 0 );

	TestYear( TEXT("Testing Unix Ones Year"), UnixOnes, 2005 );
	TestMonth( TEXT("Testing Unix Ones Month"), UnixOnes, EMonthOfYear::March );
	TestDay( TEXT("Testing Unix Ones Day"), UnixOnes, 18 );
	TestHour( TEXT("Testing Unix Ones Hour"), UnixOnes, 1 );
	TestMinute( TEXT("Testing Unix Ones Minute"), UnixOnes, 58 );
	TestSecond( TEXT("Testing Unix Ones Second"), UnixOnes, 31 );
	TestMillisecond( TEXT("Testing Unix Ones Millisecond"), UnixOnes, 0 );

	TestYear( TEXT("Testing Unix Decimal Sequence Year"), UnixDecimalSequence, 2009 );
	TestMonth( TEXT("Testing Unix Decimal Sequence Month"), UnixDecimalSequence, EMonthOfYear::February );
	TestDay( TEXT("Testing Unix Decimal Sequence Day"), UnixDecimalSequence, 13 );
	TestHour( TEXT("Testing Unix Decimal Sequence Hour"), UnixDecimalSequence, 23 );
	TestMinute( TEXT("Testing Unix Decimal Sequence Minute"), UnixDecimalSequence, 31 );
	TestSecond( TEXT("Testing Unix Decimal Sequence Second"), UnixDecimalSequence, 30 );
	TestMillisecond( TEXT("Testing Unix Decimal Sequence Millisecond"), UnixDecimalSequence, 0 );

	TestYear( TEXT("Testing Test Date Time Year"), TestDateTime, 2013 );
	TestMonth( TEXT("Testing Test Date Time Month"), TestDateTime, 8 );
	TestDay( TEXT("Testing Test Date Time Day"), TestDateTime, 14 );
	TestHour( TEXT("Testing Test Date Time Hour"), TestDateTime, 12 );
	TestMinute( TEXT("Testing Test Date Time Minute"), TestDateTime, 34 );
	TestSecond( TEXT("Testing Test Date Time Second"), TestDateTime, 56 );
	TestMillisecond( TEXT("Testing Test Date Time Millisecond"), TestDateTime, 789 );

#undef TestYear
#undef TestMonth
#undef TestDay
#undef TestHour
#undef TestMinute
#undef TestSecond
#undef TestMillisecond

	return true;
}