ShipCentralControl/Anjiehui7_DTU/User/ext_data.c

839 lines
22 KiB
C
Raw Normal View History

2025-04-03 15:59:48 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : ext_data.c
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include "includes.h"
// <20><EFBFBD><E6B4A2><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>壨FRAM<41><4D>SFlash<73><EFBFBD><E6B4A2>
loopbuff_t RF_DataM, RF_TranM;
// <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>
SemaphoreHandle_t RF_TranLock = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ext_gps_t Ext_GPS;
ext_data_t Ext_Data_Rec, Ext_Data_Rec1;
ext_count_t bottleCnt, boxCnt;
ext_bottle_idx_t bottlePSN[FRAM_BOTTLE_COUNT];
ext_box_idx_t boxTGGU[FRAM_BOX_COUNT];
ext_box_idx_t boxPSN[FRAM_BOX_COUNT];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SFlashһ<68><D2BB><EFBFBD>Լ<EFBFBD>¼
fram_sflash_valid_t FRAM_SFlash_valid = {0};
fram_sflash_valid_t SFlash_FRAM_valid = {0};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SFlash<73><68>һ<EFBFBD><D2BB><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>;<EFBFBD><CDBE><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ǣ<EFBFBD>
void CheckFramSFlashValid(uint32_t relative_time)
{
if(FRAM_SFlash_valid.offset_seconds == 0)
{
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FRAM_SFlash_valid.relative_time = relative_time;
FRAM_SFlash_valid.offset_seconds = RTC_offsetSeconds;
FRAM_SaveInfo(FRAM_SFLASH_VALID_INFO_BASE, (uint8_t *) &FRAM_SFlash_valid, sizeof(fram_sflash_valid_t));
// д<><D0B4>SFlash
SFlash_FRAM_valid.relative_time = relative_time;
SFlash_FRAM_valid.offset_seconds = RTC_offsetSeconds;
SFlash_SaveInfo(SFLASH_FRAM_VALID_INFO_BASE, (uint8_t *) &SFlash_FRAM_valid, sizeof(fram_sflash_valid_t));
}
}
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
void cacl_gprs_tran_data(ext_data_t *pGprs, data_sample_t *sample)
{
rf_app_data_t *pData = (rf_app_data_t *) pGprs->payload;
// <20>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(sample, 0, sizeof(data_sample_t));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
Calculate_Theoretical_Params(pData->Sensor.bottle_type, pData->d, pData->L, pData->chargePct, pData->density * 0.001);
sample->volumeTotal = Theoretical_Param.v - Theoretical_Param.v0;
if(pData->Sensor.staDiff == RF_SENSOR_STATUS_NORMAL)
{
if(pData->Sensor.measure_type == 1) // <20><><EFBFBD><EFBFBD>
{
// <20>ݻ<EFBFBD><DDBB>ٷֱ<D9B7>
sample->volumePct = pData->diff;
// <20><><EFBFBD><EFBFBD>
sample->volume = sample->volumeTotal * (sample->volumePct * 0.0001);
// <20><><EFBFBD><EFBFBD>
sample->weight = Vol2Quantity(sample->volume, pData->density * 0.001);
}
else
{
if(pData->Sensor.measure_type == 0) // <20><>ѹ
{
sample->diff = pData->diff * 0.01;
// Һλ
sample->height = Diff2Level(sample->diff, pData->Sensor.bottle_type, pData->d, pData->L); // <20><>λmm
}
else // <20><><EFBFBD><EFBFBD>
{
sample->height = pData->diff;
}
// <20><><EFBFBD><EFBFBD>
sample->volume = Level2Vol(sample->height, pData->Sensor.bottle_type, pData->d, pData->L);
// <20><><EFBFBD><EFBFBD>
sample->weight = Vol2Quantity(sample->volume, pData->density * 0.001);
// <20><>װ<EFBFBD><D7B0>
sample->volumePct = (float) sample->volume / sample->volumeTotal * 10000;
}
}
}
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RF_DataM<61><4D>RF_TranM<6E><4D>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>дָ<D0B4><D6B8>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>ͬ
void Data_PutToQueue(ext_data_t *pGprs)
{
int32_t nextPtr;
uint32_t second1, second2;
rf_app_data_t *pData = (rf_app_data_t *) pGprs->payload;
int16_t idx;
ext_data_t tran;
static data_sample_t sample;
S_RTC_TIME_DATA_T sRTC;
char tggu[16], mmWC[8], kg[8], pct[8], press[8], tempr[8];
ext_bottle_t bottleRec;
// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>ж<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ҳɼ<D2B2>ʱ<EFBFBD><CAB1><EFBFBD>͵<EFBFBD>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30<33><30><EFBFBD><EFBFBD>֮<EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>Ķ<EFBFBD>λȡ<CEBB><C8A1><EFBFBD><EFBFBD>˵Ķ<CBB5>λ
second1 = Calc_SecondsFromYear(INITIAL_YEAR, dcBuff.dtuData.sysTime.year + 2000, dcBuff.dtuData.sysTime.month,
dcBuff.dtuData.sysTime.day, dcBuff.dtuData.sysTime.hour, dcBuff.dtuData.sysTime.minute, dcBuff.dtuData.sysTime.second);
second2 = pGprs->recvTime - pData->relative_time;
if(dcBuff.dtuData.posState && (second1 + 1800 < second2 || second2 + 1800 < second1))
{
pData->longitude = dcBuff.dtuData.longitude;
pData->latitude = dcBuff.dtuData.latitude;
}
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
cacl_gprs_tran_data(pGprs, &sample);
pGprs->volumePct = sample.volumePct;
pGprs->volume = sample.volume;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><E3B1A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pGprs->warn = 0;
if(dcBuff.configBottle.fullPct > 0 && pData->Sensor.staDiff == RF_SENSOR_STATUS_NORMAL && sample.volumePct >= dcBuff.configBottle.fullPct)
pGprs->warn = 1;
else if(dcBuff.configBottle.emptyPct > 0 && pData->Sensor.staDiff == RF_SENSOR_STATUS_NORMAL && sample.volumePct <= dcBuff.configBottle.emptyPct)
pGprs->warn = 1;
else if(dcBuff.configBottle.warnPressH > 0 && pData->Sensor.staPress == RF_SENSOR_STATUS_NORMAL && pData->press >= dcBuff.configBottle.warnPressH)
pGprs->warn = 1;
else if(dcBuff.configBottle.warnPress > 0 && pData->Sensor.staPress == RF_SENSOR_STATUS_NORMAL && pData->press <= dcBuff.configBottle.warnPress)
pGprs->warn = 1;
else if(dcBuff.configBottle.warnTemprH > -300 && pData->Sensor.staETempr1 == RF_SENSOR_STATUS_NORMAL && pData->tempr >= dcBuff.configBottle.warnTemprH)
pGprs->warn = 1;
else if(dcBuff.configBottle.warnTempr > -300 && pData->Sensor.staETempr1 == RF_SENSOR_STATUS_NORMAL && pData->tempr <= dcBuff.configBottle.warnTempr)
pGprs->warn = 1;
else if(dcBuff.configBottle.warnVolt > 0 && pData->voltage <= dcBuff.configBottle.warnVolt)
pGprs->warn = 1;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
pGprs->fault = 0;
if(pData->Sensor.staDiff == RF_SENSOR_STATUS_UNDERFLOW || pData->Sensor.staDiff == RF_SENSOR_STATUS_OVERFLOW)
pGprs->fault = 1;
else if(pData->Sensor.staPress == RF_SENSOR_STATUS_UNDERFLOW || pData->Sensor.staPress == RF_SENSOR_STATUS_OVERFLOW)
pGprs->fault = 1;
else if(pData->Sensor.staETempr1 == RF_SENSOR_STATUS_UNDERFLOW || pData->Sensor.staETempr1 == RF_SENSOR_STATUS_OVERFLOW)
pGprs->fault = 1;
// <20>ƶ<EFBFBD>дָ<D0B4><D6B8>
nextPtr = LoopBuff_GetNextPtr(&RF_DataM, RF_DataM.info.wtPtr);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(nextPtr == RF_TranM.info.rdPtr)
{
// <20>ƶ<EFBFBD><C6B6><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
RF_TranM.info.rdPtr = LoopBuff_GetNextPtr(&RF_TranM, RF_TranM.info.rdPtr);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(nextPtr == RF_DataM.info.rdPtr)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
SFlash_LoadInfo(LoopBuff_GetDataPos(&RF_DataM, RF_DataM.info.rdPtr), (uint8_t *) &tran, sizeof(ext_data_t));
// <20>޸Ĵ<DEB8><C4B4>޵<EFBFBD><DEB5><EFBFBD>
idx = Ext_Lookup_Bottle_PSN(tran.oriPSN, bottleCnt.count);
if(idx >= 0)
{
FRAM_BufferRead(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[idx].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
if(bottleRec.lastData == RF_DataM.info.rdPtr)
{
bottleRec.lastData = -1;
FRAM_BufferWrite(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[idx].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
}
}
// <20>ƶ<EFBFBD><C6B6><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
RF_DataM.info.rdPtr = LoopBuff_GetNextPtr(&RF_DataM, RF_DataM.info.rdPtr);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD>ѯ<EFBFBD>ٶȣ<D9B6>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дSFlash<73><68>
// ֧<>ִӺ<D6B4><D3BA><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>򣩲飬<F2A3A9B2><E9A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>3<EFBFBD><33>֮һ<D6AE><D2BB>
// 1. <20><>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>2. ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>¼PSN<53><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3. ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>ǰ<EFBFBD><C7B0>¼<EFBFBD><C2BC>
pGprs->prevData = -1;
// <20><><EFBFBD>Ҵ<EFBFBD><D2B4>޵<EFBFBD><DEB5><EFBFBD>
idx = Ext_Lookup_Bottle_PSN(pGprs->oriPSN, bottleCnt.count);
if(idx >= 0)
{
FRAM_BufferRead(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[idx].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
pGprs->prevData = bottleRec.lastData;
// <20>޸Ĵ<DEB8><C4B4>޵<EFBFBD><DEB5><EFBFBD>
bottleRec.lastData = RF_DataM.info.wtPtr;
bottleRec.warn = pGprs->warn;
bottleRec.fault = pGprs->fault;
bottleRec.recvTime = pGprs->recvTime;
FRAM_BufferWrite(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * bottlePSN[idx].recNo, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼӵ<DDBC><D3B5><EFBFBD><EFBFBD><EFBFBD>
SFlash_SaveInfo(LoopBuff_GetDataPos(&RF_DataM, RF_DataM.info.wtPtr), (uint8_t *) pGprs, sizeof(ext_data_t));
// <20><><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>
RF_DataM.info.wtPtr = nextPtr;
FRAM_SaveInfo(RF_DataM.info_base, (uint8_t *) &RF_DataM.info, sizeof(RF_DataM.info));
RF_TranM.info.wtPtr = nextPtr;
FRAM_SaveInfo(RF_TranM.info_base, (uint8_t *) &RF_TranM.info, sizeof(RF_TranM.info));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>ʾ
Wakeup_CalcUTCTime(pGprs->recvTime - pData->relative_time, &sRTC);
idx = Ext_Lookup_Box_PSN(pGprs->oriPSN, boxCnt.count);
if(idx >= 0)
strcpy(tggu, boxPSN[idx].TGGU);
else
strcpy(tggu, "");
if(pData->Sensor.staDiff == RF_SENSOR_STATUS_NOCONNECT)
{
strcpy(mmWC, "---");
strcpy(kg, "---");
strcpy(pct, "---");
}
else if(pData->Sensor.staDiff == RF_SENSOR_STATUS_UNDERFLOW)
{
strcpy(mmWC, "-EE");
strcpy(kg, "-EE");
strcpy(pct, "-EE");
}
else if(pData->Sensor.staDiff == RF_SENSOR_STATUS_OVERFLOW)
{
strcpy(mmWC, "+EE");
strcpy(kg, "+EE");
strcpy(pct, "+EE");
}
else
{
sprintf(mmWC, "%d", (uint32_t) KPa2mmH2O(pData->diff * 0.01));
sprintf(kg, "%d", Vol2Quantity(pGprs->volume, pData->density * 0.001));
sprintf(pct, "%.1f", pGprs->volumePct * 0.01);
}
if(pData->Sensor.staPress == RF_SENSOR_STATUS_NOCONNECT)
strcpy(press, "---");
else if(pData->Sensor.staPress == RF_SENSOR_STATUS_UNDERFLOW)
strcpy(press, "-EE");
else if(pData->Sensor.staPress == RF_SENSOR_STATUS_OVERFLOW)
strcpy(press, "+EE");
else
sprintf(press, "%.2f", pData->press * 0.001);
if(pData->Sensor.staETempr1 == RF_SENSOR_STATUS_NOCONNECT)
strcpy(tempr, "---");
else if(pData->Sensor.staETempr1 == RF_SENSOR_STATUS_UNDERFLOW)
strcpy(tempr, "-EE");
else if(pData->Sensor.staETempr1 == RF_SENSOR_STATUS_OVERFLOW)
strcpy(tempr, "+EE");
else
sprintf(tempr, "%d", pData->tempr);
sprintf(gridAll.rowStr[0], " %02d-%02d %02d:%02d %11s %7s %7s %5s %7s %6s %2s %2s 20%02d%02d%02d%02d%03d",
sRTC.u32Month, sRTC.u32Day, sRTC.u32Hour, sRTC.u32Minute,
tggu, mmWC, kg, pct, press, tempr, (pGprs->warn ? "W" : ""), (pGprs->fault ? "F" : ""),
pGprs->oriPSN[0], pGprs->oriPSN[1], pGprs->oriPSN[2], pGprs->oriPSN[3], (pGprs->oriPSN[4] << 8) | pGprs->oriPSN[5]);
Form_ScrollGrid(&gridAll);
// <20><><EFBFBD><EFBFBD><EBB1A8>ҳ<EFBFBD><D2B3>ʾ
if(pGprs->warn || pGprs->fault)
{
strcpy(gridWarn.rowStr[0], gridAll.rowStr[0]);
Form_ScrollGrid(&gridWarn);
}
// <20><><EFBFBD><EFBFBD><E2B1A8>
if(pGprs->warn && !IS_ALARM_ON())
KZ_ALARM_ON();
// <20><><EFBFBD><EFBFBD>485<38><35><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>
LoopBuff_PutItem(&Modbus_SendM, (uint8_t *) pGprs);
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
xSemaphoreGive(Modbus_SendQ);
}
void Data_Open()
{
int16_t i, j, len;
uint8_t clearData = 0;
ext_bottle_t bottleRec;
ext_box_t boxRec;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô洢<C3B4><E6B4A2><EFBFBD><EFBFBD>RF_DataMΪ<4D><CEAA>ʷ<EFBFBD><CAB7>¼<EFBFBD><C2BC>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>RF_TranMΪ<4D>ϴ<EFBFBD><CFB4>ɹ<EFBFBD><C9B9>Ժ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>
LoopBuff_Create(&RF_DataM, sizeof(ext_data_t), SFLASH_DATA_COUNT, FRAM_DATA_INFO_BASE, SFLASH_DATA_BASE);
LoopBuff_Create(&RF_TranM, sizeof(ext_data_t), SFLASH_DATA_COUNT, FRAM_TRAN_INFO_BASE, SFLASH_DATA_BASE);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RF_TranLock = xSemaphoreCreateBinary();
xSemaphoreGive(RF_TranLock);
#if 0
// <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><DEB5><EFBFBD>
bottleCnt.count = 500;
for(i = 0; i < bottleCnt.count; i++)
{
memset(&bottleRec, 0, sizeof(ext_bottle_t));
bottleRec.PSN[0] = 10;
bottleRec.PSN[3] = (10 + i * 10) / 1000;
bottleRec.PSN[4] = ((10 + i * 10) % 1000) >> 8;
bottleRec.PSN[5] = ((10 + i * 10) % 1000) & 0xFF;
bottleRec.lastData = -1;
FRAM_BufferWrite(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * i, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
}
FRAM_SaveInfo(FRAM_BOTTLE_INFO_BASE, (uint8_t *) &bottleCnt, sizeof(ext_count_t));
#endif
#if 0
// <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD><DEB5><EFBFBD>
bottleCnt.count = 0;
//FRAM_SaveInfo(FRAM_BOTTLE_INFO_BASE, (uint8_t *) &bottleCnt, sizeof(ext_count_t));
FRAM_SaveInfo(0, 0, FRAM_SIZE);
#endif
2025-05-12 15:21:16 +08:00
#if 0
2025-04-03 15:59:48 +08:00
// <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
2025-05-12 15:21:16 +08:00
boxCnt.count = 5;
2025-04-03 15:59:48 +08:00
for(i = 0; i < boxCnt.count; i++)
{
memset(&boxRec, 0, sizeof(ext_box_t));
2025-04-30 14:53:16 +08:00
boxRec.PSN[0] = 26;
boxRec.PSN[3] = (0 + i * 1) / 1000;
boxRec.PSN[4] = ((0 + i * 1) % 1000) >> 8;
boxRec.PSN[5] = ((0 + i * 1) % 1000) & 0xFF;
strcpy(boxRec.TGGU, "TGGU2000000");
boxRec.TGGU[7] = '0' + (0 + i) / 100;
boxRec.TGGU[8] = '0' + (0 + i) % 100 / 10;
boxRec.TGGU[9] = '0' + (0 + i) % 10;
2025-04-03 15:59:48 +08:00
FRAM_BufferWrite(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * i, (uint8_t *) &boxRec, sizeof(ext_box_t));
}
FRAM_SaveInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t));
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>޵<EFBFBD><DEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PSN<53><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FRAM_LoadInfo(FRAM_BOTTLE_INFO_BASE, (uint8_t *) &bottleCnt, sizeof(ext_count_t));
for(i = 0; i < bottleCnt.count; i++)
{
FRAM_BufferRead(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * i, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
memmove(bottlePSN[i].PSN, bottleRec.PSN, 6);
bottlePSN[i].recNo = i;
}
Ext_Sort_Bottle_PSN(bottlePSN, 0, bottleCnt.count - 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TGGU<47><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FRAM_LoadInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t));
for(i = 0; i < boxCnt.count; i++)
{
FRAM_BufferRead(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * i, (uint8_t *) &boxRec, sizeof(ext_box_t));
// ת<><D7AA><EFBFBD>ɴ<EFBFBD>д
len = strlen(boxRec.TGGU);
for(j = 0; j < len; j++)
{
if(boxRec.TGGU[j] >= 'a' && boxRec.TGGU[j] <= 'z')
boxRec.TGGU[j] -= 32;
}
strcpy(boxTGGU[i].TGGU, boxRec.TGGU);
memmove(boxTGGU[i].PSN, boxRec.PSN, 6);
boxTGGU[i].recNo = i;
strcpy(boxPSN[i].TGGU, boxRec.TGGU);
memmove(boxPSN[i].PSN, boxRec.PSN, 6);
boxPSN[i].recNo = i;
}
Ext_Sort_Box_TGGU(boxTGGU, 0, boxCnt.count - 1);
Ext_Sort_Box_PSN(boxPSN, 0, boxCnt.count - 1);
// <20><>FRAM<41><4D>ȡ<EFBFBD><C8A1>¼<EFBFBD><C2BC>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
FRAM_LoadInfo(RF_DataM.info_base, (uint8_t *) &RF_DataM.info, sizeof(RF_DataM.info));
FRAM_LoadInfo(RF_TranM.info_base, (uint8_t *) &RF_TranM.info, sizeof(RF_TranM.info));
if(RF_DataM.info.rdPtr > RF_DataM.maxItemCount || RF_TranM.info.rdPtr > RF_TranM.maxItemCount
|| RF_DataM.info.wtPtr > RF_DataM.maxItemCount || RF_DataM.maxItemCount != RF_TranM.maxItemCount
|| RF_DataM.data_base != RF_TranM.data_base || RF_DataM.itemSize != RF_TranM.itemSize
|| RF_DataM.info.wtPtr != RF_TranM.info.wtPtr)
{
clearData = 1;
}
// <20><>FRAM<41><4D>SFlash<73>ֱ<EFBFBD><D6B1><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD>Լ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>Ƿ<EFBFBD>һ<EFBFBD><D2BB>
if(!FRAM_LoadInfo(FRAM_SFLASH_VALID_INFO_BASE, (uint8_t *) &FRAM_SFlash_valid, sizeof(fram_sflash_valid_t))
|| !SFlash_LoadInfo(SFLASH_FRAM_VALID_INFO_BASE, (uint8_t *) &SFlash_FRAM_valid, sizeof(fram_sflash_valid_t))
|| FRAM_SFlash_valid.relative_time != SFlash_FRAM_valid.relative_time
|| FRAM_SFlash_valid.offset_seconds != SFlash_FRAM_valid.offset_seconds)
{
// <20>һ<E7B2BB>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>¼<EFBFBD><C2BC>Ч
clearData = 1;
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Լ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>UTCʱ<43><CAB1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&FRAM_SFlash_valid, 0, sizeof(fram_sflash_valid_t));
memset(&SFlash_FRAM_valid, 0, sizeof(fram_sflash_valid_t));
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
if(clearData)
{
memset(&RF_TranM.info, 0, sizeof(RF_TranM.info));
FRAM_SaveInfo(RF_TranM.info_base, (uint8_t *) &RF_TranM.info, sizeof(RF_TranM.info));
memset(&RF_DataM.info, 0, sizeof(RF_DataM.info));
FRAM_SaveInfo(RF_DataM.info_base, (uint8_t *) &RF_DataM.info, sizeof(RF_DataM.info));
for(i = 0; i < bottleCnt.count; i++)
{
FRAM_BufferRead(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * i, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
bottleRec.lastData = -1;
bottleRec.warn = 0;
bottleRec.fault = 0;
FRAM_BufferWrite(FRAM_BOTTLE_DATA_BASE + sizeof(ext_bottle_t) * i, (uint8_t *) &bottleRec, sizeof(ext_bottle_t));
}
}
}
// <20><><EFBFBD><EFBFBD>PSN<53><4E><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>򷵻<EFBFBD>-1
int16_t Ext_Lookup_Bottle_PSN(uint8_t PSN[], int16_t cnt)
{
int16_t i0 = 0;
int16_t i1 = cnt - 1;
int16_t i;
int16_t cmp;
if(cnt <= 0)
return -1;
while(1)
{
i = (i0 + i1) / 2;
cmp = memcmp(PSN, bottlePSN[i].PSN, 6);
if(cmp == 0)
return i;
if(cmp > 0)
{
if(i == i1)
return -1;
i0 = i + 1;
}
else
{
if(i == i0)
return -1;
i1 = i - 1;
}
}
return -1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>򷵻<EFBFBD>-1
int16_t Ext_Lookup_Box_TGGU(char TGGU[], int16_t cnt)
{
int16_t i0 = 0;
int16_t i1 = cnt - 1;
int16_t i;
int16_t cmp;
if(cnt <= 0)
return -1;
while(1)
{
i = (i0 + i1) / 2;
cmp = strcmp(TGGU, boxTGGU[i].TGGU);
if(cmp == 0)
return i;
if(cmp > 0)
{
if(i == i1)
return -1;
i0 = i + 1;
}
else
{
if(i == i0)
return -1;
i1 = i - 1;
}
}
return -1;
}
// <20><><EFBFBD><EFBFBD>PSN<53><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>򷵻<EFBFBD>-1
int16_t Ext_Lookup_Box_PSN(uint8_t PSN[], int16_t cnt)
{
int16_t i0 = 0;
int16_t i1 = cnt - 1;
int16_t i;
int16_t cmp;
if(cnt <= 0)
return -1;
while(1)
{
i = (i0 + i1) / 2;
cmp = memcmp(PSN, boxPSN[i].PSN, 6);
if(cmp == 0)
return i;
if(cmp > 0)
{
if(i == i1)
return -1;
i0 = i + 1;
}
else
{
if(i == i0)
return -1;
i1 = i - 1;
}
}
return -1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t partition_bottle_psn(ext_bottle_idx_t a[], int16_t lo, int16_t hi)
{
int16_t i = lo;
int16_t j = hi + 1;
ext_bottle_idx_t tmp;
while(1)
{
while(memcmp(a[++i].PSN, a[lo].PSN, 6) < 0)
{
if(i == hi)
break;
}
while(memcmp(a[--j].PSN, a[lo].PSN, 6) > 0);
if(i >= j)
break;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
tmp = a[lo];
a[lo] = a[j];
a[j] = tmp;
return j;
}
void Ext_Sort_Bottle_PSN(ext_bottle_idx_t a[], int16_t lo, int16_t hi)
{
#if 0
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬵ݹ麯<DDB9><E9BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪStack̫<6B><CCAB>
int16_t j;
if(hi <= lo)
return;
j = partition_bottle_psn(a, lo, hi);
Ext_Sort_Bottle_PSN(a, lo, j - 1);
Ext_Sort_Bottle_PSN(a, j + 1, hi);
#else
// ð<><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t i, j, k;
ext_bottle_idx_t tmp;
for(i = 0; i < hi; i++)
{
// <20>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֵ
k = i;
for(j = i + 1; j <= hi; j++)
{
if(memcmp(a[j].PSN, a[k].PSN, 6) < 0)
k = j;
}
// <20><><EFBFBD><EFBFBD>
if(k != i)
{
tmp = a[k];
a[k] = a[i];
a[i] = tmp;
}
}
#endif
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t partition_box_tggu(ext_box_idx_t a[], int16_t lo, int16_t hi)
{
int16_t i = lo;
int16_t j = hi + 1;
ext_box_idx_t tmp;
while(1)
{
while(strcmp(a[++i].TGGU, a[lo].TGGU) < 0)
{
if(i == hi)
break;
}
while(strcmp(a[--j].TGGU, a[lo].TGGU) > 0);
if(i >= j)
break;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
tmp = a[lo];
a[lo] = a[j];
a[j] = tmp;
return j;
}
void Ext_Sort_Box_TGGU(ext_box_idx_t a[], int16_t lo, int16_t hi)
{
#if 0
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬵ݹ麯<DDB9><E9BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪStack̫<6B><CCAB>
int16_t j;
if(hi <= lo)
return;
j = partition_box_tggu(a, lo, hi);
Ext_Sort_Box_TGGU(a, lo, j - 1);
Ext_Sort_Box_TGGU(a, j + 1, hi);
#else
// ð<><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t i, j, k;
ext_box_idx_t tmp;
for(i = 0; i < hi; i++)
{
// <20>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֵ
k = i;
for(j = i + 1; j <= hi; j++)
{
if(strcmp(a[j].TGGU, a[k].TGGU) < 0)
k = j;
}
// <20><><EFBFBD><EFBFBD>
if(k != i)
{
tmp = a[k];
a[k] = a[i];
a[i] = tmp;
}
}
#endif
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t partition_box_psn(ext_box_idx_t a[], int16_t lo, int16_t hi)
{
int16_t i = lo;
int16_t j = hi + 1;
ext_box_idx_t tmp;
while(1)
{
while(memcmp(a[++i].PSN, a[lo].PSN, 6) < 0)
{
if(i == hi)
break;
}
while(memcmp(a[--j].PSN, a[lo].PSN, 6) > 0);
if(i >= j)
break;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
tmp = a[lo];
a[lo] = a[j];
a[j] = tmp;
return j;
}
void Ext_Sort_Box_PSN(ext_box_idx_t a[], int16_t lo, int16_t hi)
{
#if 0
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬵ݹ麯<DDB9><E9BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪStack̫<6B><CCAB>
int16_t j;
if(hi <= lo)
return;
j = partition_box_psn(a, lo, hi);
Ext_Sort_Box_PSN(a, lo, j - 1);
Ext_Sort_Box_PSN(a, j + 1, hi);
#else
// ð<><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t i, j, k;
ext_box_idx_t tmp;
for(i = 0; i < hi; i++)
{
// <20>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֵ
k = i;
for(j = i + 1; j <= hi; j++)
{
if(memcmp(a[j].PSN, a[k].PSN, 6) < 0)
k = j;
}
// <20><><EFBFBD><EFBFBD>
if(k != i)
{
tmp = a[k];
a[k] = a[i];
a[i] = tmp;
}
}
#endif
}
// <20><><EFBFBD>´ӷ<C2B4><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5><C4B9><EFBFBD><E4B5B5>
// <20><><EFBFBD>ݸ<EFBFBD>ʽΪ"<PSN<53><4E>11λ>,<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>>;<PSN<53><4E>11λ>,<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>>;....." (PSNǰ2λ<32>̶<EFBFBD>Ϊ"20")
// <20><>"21110180010,TGGU2000010;10000000020,TGGU2000020"
// <20><>ʾ2<CABE><32><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD>PSN: 2021110180010<31><30>TGGU2000010<31><30><EFBFBD><EFBFBD>PSN: 2010000000020<32><30>TGGU2000020<32><30>
void Ext_Update_Boxes(char *buff)
{
int16_t count = 0, len = strlen(buff);
char *pChr;
char record[32], psn[16];
ext_box_t boxRec;
// <20><>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>޵<EFBFBD><DEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>¹<EFBFBD><C2B9><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
boxCnt.count = 0;
while(len > 0)
{
// <20><><EFBFBD><EFBFBD>';'<27><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
pChr = strchr(buff, ';');
if(pChr)
{
if(pChr >= buff + sizeof(record)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
break;
strncpy(record, buff, pChr - buff);
record[pChr - buff] = 0;
buff++; // <20>ֺ<EFBFBD>ռ<EFBFBD><D5BC>λ<EFBFBD><CEBB>
}
else // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
{
if(len >= sizeof(record)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
break;
strcpy(record, buff);
}
// <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
buff += strlen(record);
len = strlen(buff);
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>¼
memset(&boxRec, 0, sizeof(ext_box_t));
// <20><><EFBFBD><EFBFBD>','<27><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
pChr = strchr(record, ',');
if(!pChr || pChr != record + 11) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
break;
strncpy(psn, record, pChr - record);
psn[pChr - record] = 0;
if(strlen(pChr + 1) >= sizeof(boxRec.TGGU)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
break;
strcpy(boxRec.TGGU, pChr + 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
pChr = psn;
while(*pChr)
{
if(!isdigit(*pChr)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
{
len = 0;
break;
}
pChr++;
}
// ת<><D7AA><EFBFBD>ɴ<EFBFBD>д
pChr = boxRec.TGGU;
while(*pChr)
{
if(*pChr >= 'a' && *pChr <= 'z')
*pChr -= 32;
pChr++;
}
// <20><><EFBFBD>Ӽ<EFBFBD>¼
boxRec.PSN[5] = atoi(psn + 8) & 0xFF;
boxRec.PSN[4] = atoi(psn + 8) >> 8;
psn[8] = 0;
boxRec.PSN[3] = atoi(psn + 6);
psn[6] = 0;
boxRec.PSN[2] = atoi(psn + 4);
psn[4] = 0;
boxRec.PSN[1] = atoi(psn + 2);
psn[2] = 0;
boxRec.PSN[0] = atoi(psn);
FRAM_BufferWrite(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * count, (uint8_t *) &boxRec, sizeof(ext_box_t));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
strcpy(boxTGGU[count].TGGU, boxRec.TGGU);
memmove(boxTGGU[count].PSN, boxRec.PSN, 6);
boxTGGU[count].recNo = count;
strcpy(boxPSN[count].TGGU, boxRec.TGGU);
memmove(boxPSN[count].PSN, boxRec.PSN, 6);
boxPSN[count].recNo = count;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
count++;
}
// <20>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>
Ext_Sort_Box_TGGU(boxTGGU, 0, count - 1);
Ext_Sort_Box_PSN(boxPSN, 0, count - 1);
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
boxCnt.count = count;
FRAM_SaveInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t));
}