#include "database.h" #include "usart.h" Database db; void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, uint16_t pullSize2); void Database_Push(uint16_t pushArr[], uint16_t len); void Database_Pull(uint16_t pullArr[], uint16_t len); void Database_Delete(void); void DataHandle(void); void RecordScale(void);//记录刻度 void RecordScale_Eve(void); uint16_t PDA_pushArr[1024]; uint16_t PT_pullArr[1024]; extern TipsFlag tipsflag; extern Menu_table menu; // LocDbHeadStart ((uint32_t)0x8060000) //位置信息头部 // LocDbBodyStart ((uint32_t)0x8060800) //位置信息身体 // EveDbHeadStart ((uint32_t)0x8070000) //状态信息头部 // EveDbBodyStart ((uint32_t)0x8070800) //状态信息身体 /** * @breaf 数据库初始化 * @Explanation 向各头部写入关键信息 */ void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, uint16_t pullSize2) { Flash_ReadBytes(db.LOC_InitInfo,LocDbHeadStart,4); if(db.LOC_InitInfo[0]==0xffff && db.LOC_InitInfo[2]==0xffff)//未进行写入 { //*LOC_InitInfo 0:pushIndex 1:pullIndex 2:pushSize 3:pullSize db.LOC_InitInfo[0] = (uint16_t)0;//初始化入库指针 db.LOC_InitInfo[1] = (uint16_t)0;//初始化出库指针 db.LOC_InitInfo[2] = (uint16_t)pushSize1; db.LOC_InitInfo[3] = (uint16_t)pullSize1; Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,4);//4*2B HAL_Delay(200); } else//已写入 { //TODO } Flash_ReadBytes(db.EVE_InitInfo,EveDbHeadStart,4); if(db.EVE_InitInfo[0]==0xffff && db.EVE_InitInfo[2]==0xffff)//未进行写入 { //*EVE_InitInfo 0:pushIndex 1:pullIndex 2:pushSize 3:pullSize db.EVE_InitInfo[0] = (uint16_t)0; db.EVE_InitInfo[1] = (uint16_t)0; db.EVE_InitInfo[2] = (uint16_t)pushSize2; db.EVE_InitInfo[3] = (uint16_t)pullSize2; Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,4);//4*2B HAL_Delay(200); } else//已写入 { //TODO } } /* * uint16_t pushArr[7]={0x1234,0x4567, 0x1111,0x2222,0x3333,0x4444, 0xAAAA}; Database_Push(pushArr,7); Database_Pull(pullArr,7); uint16_t pullArr[7]={0}; */ HAL_StatusTypeDef PushSta; uint16_t temp_jc[7];//检测相同缓存 uint16_t temp_jc_Eve[7];//检测相同缓存 uint32_t newPushIndex_Loc=0; uint32_t newPullIndex_Loc=0; bool Overwrite_pushindex =false; bool Overwrite_pushindex_Eve =false; bool repeatFlag = false; bool repeatFlag_Eve = false; //***************定位信息入库 void Database_Push_Loc(uint16_t pushArr[], uint16_t len) { if(db.LOC_InitInfo[0] == 0) //Loc PushIndex Init { PushSta = Flash_WriteBytes(pushArr,LocDbBodyStart,len);//len*2B if(PushSta == HAL_OK) { db.LOC_InitInfo[0] += 1; Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B } } //*读取缓存检测 Flash_ReadBytes(temp_jc,LocDbBodyStart+((db.LOC_InitInfo[0]-1)*14),7);//len*2B //*uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], db.speed[0]};//4B世纪秒+8B经纬度+2B速度 if(db.LOC_InitInfo[0] > 0 && temp_jc[2]== db.WD_u16[0] && temp_jc[3]== db.WD_u16[1] && temp_jc[4]== db.JD_u16[0] && temp_jc[5]== db.JD_u16[1])//做相同检测 { //*数据一样无需写入操作 } else { if(Overwrite_pushindex)//重头,避免多次写入 { Overwrite_pushindex = false; } else { PushSta = Flash_WriteBytes(pushArr,(LocDbBodyStart+(db.LOC_InitInfo[0]*14)),len);//len*2B if(PushSta == HAL_OK) { db.LOC_InitInfo[0] = db.LOC_InitInfo[0]+1;//写入较记录少1,在头开始写入 Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B } } } RecordScale(); } void Database_Pull_Loc(uint16_t pullArr[], uint16_t len)//14B { if(db.LOC_InitInfo[1] == 0) //Loc PullIndex Init { Flash_ReadBytes(pullArr,LocDbBodyStart,len);//len*2B db.LOC_InitInfo[1] += 1; Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B//更新出库指针 } else { if(db.LOC_InitInfo[1] == db.LOC_InitInfo[0])//*判出库刻度是否等于写入刻度 { Flash_ReadBytes(pullArr,(LocDbBodyStart+(db.LOC_InitInfo[1]*14)),len);//len*2B repeatFlag = true; } else { repeatFlag = false; Flash_ReadBytes(pullArr,(LocDbBodyStart+(db.LOC_InitInfo[1]*14)),len);//len*2B db.LOC_InitInfo[1]+=1; Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B//更新出库指针 } } RecordScale(); } //***************状态信息入库 void Database_Push_Eve(uint16_t pushArr[], uint16_t len) { if(db.EVE_InitInfo[0] == 0) //Loc PushIndex Init { PushSta = Flash_WriteBytes(pushArr,EveDbBodyStart,len);//len*2B if(PushSta == HAL_OK) { db.EVE_InitInfo[0] += 1; Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,1);//1*2B } } //*读取缓存检测 Flash_ReadBytes(temp_jc_Eve,EveDbBodyStart+((db.EVE_InitInfo[0]-1)*14),14);//len*2B //*uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], db.speed[0]};//4B世纪秒+8B经纬度+2B速度 if(db.EVE_InitInfo[0] > 0 && temp_jc_Eve[2]== db.WD_u16[0] && temp_jc_Eve[3]== db.WD_u16[1] && temp_jc_Eve[4]== db.JD_u16[0] && temp_jc_Eve[5]== db.JD_u16[1])//做相同检测 { //*数据一样无需写入操作 } else { if(Overwrite_pushindex_Eve)//重头,避免多次写入 { Overwrite_pushindex_Eve = false; } else { PushSta = Flash_WriteBytes(pushArr,(EveDbBodyStart+(db.EVE_InitInfo[0]*28)),len);//len*2B if(PushSta == HAL_OK) { db.EVE_InitInfo[0] = db.EVE_InitInfo[0]+1;//写入较记录少1,在头开始写入 Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,1);//1*2B } } } RecordScale_Eve(); } void DataHandle(void)//接收与发送数据处理 { } void RecordScale(void)//记录刻度 { Flash_ReadBytes(db.LOC_InitInfo, LocDbHeadStart, 4); //读取入库刻度 if(db.LOC_InitInfo[0] == db.LOC_InitInfo[2])//入库结束(返回 { db.LOC_InitInfo[0]=0; Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B 更新最新刻度 Overwrite_pushindex=true; } else if(db.LOC_InitInfo[1] == db.LOC_InitInfo[3])//出库结束(返回 { db.LOC_InitInfo[1]=0; Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B 更新最新刻度 } } void RecordScale_Eve(void)//记录刻度 { Flash_ReadBytes(db.EVE_InitInfo, EveDbHeadStart, 4); //读取入库刻度 if(db.EVE_InitInfo[0] == db.EVE_InitInfo[2])//入库结束(返回 { db.EVE_InitInfo[0]=0; Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,1);//1*2B 更新最新刻度 Overwrite_pushindex_Eve=true; } } void testLoc(void) { uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], db.speed[0]};//4B世纪秒+8B经纬度+2B速度 Database_Push_Loc(TESTDATA, 7);//14B 写入操作 uint16_t TESTDATApull[7]; Database_Pull_Loc(TESTDATApull, 7); if(!repeatFlag) { printf("出库:%04X%04X%04X%04X%04X%04X%04X\n",TESTDATApull[0],TESTDATApull[1],TESTDATApull[2],TESTDATApull[3],TESTDATApull[4],TESTDATApull[5],TESTDATApull[6]); } else { printf("与上次相同\r\n"); } } void testEve(void) { uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], \ db.LockSn[0],db.LockSn[1],db.LockSn[2], db.OperationType[0],db.OperationResults[0], db.perators[0], db.perators[1], db.ElectricityLevel[0]};//4B世纪秒+8B经纬度+2B速度 //Database_Push_Eve(TESTDATA, 14);//28B 写入操作 }