記錄貼----四頁定時充放電時間段校驗

目的:
目前已經完成的是四頁充放電時間及其功率,每一頁都是分別由‘充電起始時間,充電結束時間,充電功率,放電起始時間,放電結束時間,放電功率’。由於充電時間段和放電放電時間段之間不能有交叉,因此需要校驗設置的時間是否合規。以前代碼只是設置了一頁,因此只需要對一頁的充電時間段和放電時間段校驗即可。現在擴展到四頁,需要對該頁,以及頁和頁之間的時間段之間相互比較。代碼及其註釋如下:

UINT8 InitEnergyMode(UINT8 mode)
{
	#define PAGE_OF_USE_MAX		4       //  定時充放電裏頁面頁數
	UINT8 err = 0, i,j, index = 0;
    UINT8 page_bit = 0;
	UINT8 page_count = 0;
   	UINT16 charge_start_time[PAGE_OF_USE_MAX] = { 0 };
	UINT16 charge_end_time[PAGE_OF_USE_MAX] = { 0 };
	UINT16 discharge_start_time[PAGE_OF_USE_MAX] = { 0 };
	UINT16 discharge_end_time[PAGE_OF_USE_MAX] = { 0 };
	PAGE_OF_USE_MAX
    ........
    else if(MANUALMODE == mode)
    {
		err = 0;
		page_bit = 0;
		index = 0;
		/*判斷使能的頁位置*/
		for (i = 0; i < PAGE_OF_USE_MAX; i++)
        {
            if(PageofUse[i].bit.enable)
            {  
                if (i==0)  page_bit |= 0x01;
                else if (i==1)  page_bit |= 0x02;
                else if (i==2)  page_bit |= 0x04;
                else if (i==3)  page_bit |= 0x08;

				charge_start_time[index] =  (PageofUse[i].bit.chgsthour << 8) +                     PageofUse[i].bit.chgstmin;
				charge_end_time[index] =  (PageofUse[i].bit.chgendhour << 8) + PageofUse[i].bit.chgendmin;
				discharge_start_time[index]	= (PageofUse[i].bit.dischgsthour << 8) + PageofUse[i].bit.dischgstmin;
				discharge_end_time[index] =  (PageofUse[i].bit.dischgendhour << 8) + PageofUse[i].bit.dischgendmin;
				if (index < PAGE_OF_USE_MAX - 1)	index++;        //防止程序跑飛
            }
        }

        /*判斷使能的頁數*/
//		page_count = 0;
//		while (page_bit)
//		{
//			if(0x01 == (page_bit&0x01))
//			{
//				page_cpunt++;
//				page_bit >>= 1;
//			}
//		}

		page_count = index;
		/*比較charge時間*/
		for (i=0; i < page_count; i++)
		{
			for(j=i+1; j < page_count; j++)
			{
				if(!TimePeriodCertificated(charge_start_time[i], charge_end_time[i], charge_start_time[j], charge_end_time[j]))
				{
					err = 1;
				}
			}
		}
		/*比較discharge時間*/
		for (i=0; i < page_count; i++)
		{
			for(j=i+1; j < page_count; j++)
			{
				if (!TimePeriodCertificated (discharge_start_time[i], discharge_end_time[i], discharge_start_time[j], discharge_end_time[j]))
				{
					err = 1;
				}
			}
		}
		/*比較charge和discharge時間*/
		for (i = 0; i < page_count; i++)
		{
			for (j = 0; j < page_count; j++)
			{
				if (!TimePeriodCertificated (charge_start_time[i], charge_end_time[i], discharge_start_time[j], discharge_end_time[j]))
				{
					err = 1;
				}
			}
		}
		/*數據檢驗無誤的情況下,立flag*/
        if(err == 0 && page_count != 0)
        {
            Mode3DataCertificateFlag = 1;
        }

		/*時間比較通過,並且有使能頁的情況下*/
		if (err == 0)
		{
			for (i = 0; i < PAGE_OF_USE_MAX; i++)
	        {
	            if(PageofUse[i].bit.enable)
	            {  
                    EepromWrite((INT8U *)&PageofUse[i], EEPROMADDR_WKM3_DATA+i*MODE3_OF_USE_SIZE*2, MODE3_OF_USE_SIZE*2);
                    EepromWriteBack((INT8U *)&PageofUse[i], EEPROMADDR_WKM3_DATA+i*MODE3_OF_USE_SIZE*2, MODE3_OF_USE_SIZE*2);
	            }
	        }
		}
    }

}

前面的一個for語句,通過page_bit來保存某幾頁使能,然後由於沒使能的頁的數據不需要參與比較,因此需要把使能了的頁數據保存到buff裏,以便下面進行比較。這裏是定義了一個數組來暫存這些數據。index也順帶就是使能的頁數,賦值給page_count。

下面的三個for依次檢測充電時間段和充電事件單,放電時間段和放電時間段,以及充電時間段和放電時間段,需要注意的時是,由於第0頁的充電時間不需要和自己的第0頁的充電時間相比較,因此前面兩個嵌套for二級循環從i+1開始,這一點需要注意。

由於先前把使能了的頁面的數據暫存在四個數組裏,因此下面纔可以用for循環,這種將不連續的暫存到buffer裏,以構成連續,因此可以用for循環來實現,以減小代碼量。這種編程思想後面可以多學習。

下面記錄的是中間的

bool TimePeriodCertificated(UINT16 TempTimeS1,UINT16 TempTimeE1,UINT16 TempTimeS2,UINT16 TempTimeE2)

bool TimePeriodCertificated(UINT16 TempTimeS1,UINT16 TempTimeE1,UINT16 TempTimeS2,UINT16 TempTimeE2)
{
	    	if( \
		((TempTimeS1 <= TempTimeE1)&&((TempTimeS2>=TempTimeS1)&&(TempTimeS2<=TempTimeE1)))|| \
		((TempTimeS1 <= TempTimeE1)&&((TempTimeE2>=TempTimeS1)&&(TempTimeE2<=TempTimeE1))))
	return 0;

	if( \
		((TempTimeS1 >= TempTimeE1)&&((TempTimeS2>=TempTimeS1)||(TempTimeS2<=TempTimeE1)))|| \
		((TempTimeS1 >= TempTimeE1)&&((TempTimeE2>=TempTimeS1)||(TempTimeE2<=TempTimeE1))))
	return 0;
	if( \
		((TempTimeS2 <= TempTimeE2)&&((TempTimeS1>=TempTimeS2)&&(TempTimeS1<=TempTimeE2)))|| \
		((TempTimeS2 <= TempTimeE2)&&((TempTimeE1>=TempTimeS2)&&(TempTimeE1<=TempTimeE2))))
	return 0;
	if( \
		((TempTimeS2 >= TempTimeE2)&&((TempTimeS1>=TempTimeS2)||(TempTimeS1<=TempTimeE2)))|| \
		((TempTimeS2 >= TempTimeE2)&&((TempTimeE1>=TempTimeS2)||(TempTimeE1<=TempTimeE2))))
	return 0;
	return 1;
}

傳入的形參,是四個時間點,分別是第一段時間的起始時間點,結束時間點以及第二段時間的起始時間點和結束時間點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章