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