#include "database.h" #include "usart.h" #include "tt808.h" uint16_t PDA_pushArr[1024]; extern TipsFlag tipsflag; extern Menu_table menu; DatabaseLoc dbloc; DatabaseEvent dbeve; DatabaseLoc *dblocptr = &dbloc; DatabaseEvent *dbeveptr = &dbeve; bool uploaweork=false; /** * @breaf 数据库初始化 * @Explanation 向各头部写入关键信息 */ void Database_init(uint16_t pushsize_loc, uint16_t pullsize_loc,uint16_t pushsize_eve, uint16_t pullsize_eve) { dblocptr->headinfo.loc_Conter=0; dblocptr->location.alarmFlagH=0; dblocptr->location.alarmFlagL=0; dblocptr->location.height=0; dblocptr->location.direction=0; dblocptr->location.signalCmd=0x30; dblocptr->location.signalCmd_len=0x01; dblocptr->location.atellitesCmd=0x31; dblocptr->location.atellitesCmd_len=0x01; Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.loc_pushIndex),LocDbHeadStart,4);//读取loc头部是否发生写入 if(dblocptr->temppush.loc_pullIndex == 0xFFFF && dblocptr->temppush.loc_pushIndex==0xFFFF)//未写入 { dblocptr->headinfo.loc_pushIndex = 0; dblocptr->headinfo.loc_pullIndex = 0; dblocptr->headinfo.loc_pushSize = pushsize_loc; dblocptr->headinfo.loc_pullSize = pullsize_loc; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4); } else { //*高地址字节在前 dblocptr->headinfo.loc_pushIndex = dblocptr->temppush.loc_pushIndex; dblocptr->headinfo.loc_pullIndex = dblocptr->temppush.loc_pullIndex; dblocptr->headinfo.loc_pushSize = dblocptr->temppush.loc_pushSize; dblocptr->headinfo.loc_pullSize = dblocptr->temppush.loc_pullSize; } // Flash_ReadBytes((uint16_t*)&(dbeveptr->temppush),EveDbHeadStart,4);//读取loc头部是否发生写入 // if(dbeveptr->temppush.eve_pushIndex == 0xFFFF && dbeveptr->temppush.eve_pullIndex ==0xFFFF)//未写入 // { // dbeveptr->headinfo.eve_pushIndex = 0; // dbeveptr->headinfo.eve_pullIndex = 0; // dbeveptr->headinfo.eve_pushSize = pushsize_loc; // dbeveptr->headinfo.eve_pullSize = pullsize_loc; // Flash_WriteBytes((uint16_t*)&(dbeveptr->headinfo),EveDbHeadStart,4); // } // else // { // //*高地址字节在前 // dbeveptr->headinfo.eve_pushIndex = dbeveptr->temppush.eve_pushIndex; // dbeveptr->headinfo.eve_pullIndex = dbeveptr->temppush.eve_pullIndex; // dbeveptr->headinfo.eve_pushSize = dbeveptr->temppush.eve_pushSize; // dbeveptr->headinfo.eve_pullSize = dbeveptr->temppush.eve_pullSize; // } } bool Overwrite_loc = false; HAL_StatusTypeDef PushSta; //***************定位信息入库 //*20min最少一条 //*大于10km每5min一条 void Database_Push(uint8_t object) { if(object==0)//位置信息写入 { #if timingPush==1 if(dblocptr->temppush.loc_pushIndex!=0 && dblocptr->location.speed>0)//速度大于10km/h入库(100) #else if(dblocptr->temppush.loc_pushIndex!=0 && dblocptr->location.speed>10)//速度大于10km/h入库 #endif { Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pushIndex-1)*34),17);//读取body信息 if(dblocptr->temppush.alarmFlagH==0xFFFF) { dblocptr->temppush.alarmFlagH=0; dblocptr->temppush.alarmFlagL=0; dblocptr->temppush.statusFlagH=0; //状态标志 dblocptr->temppush.statusFlagL=0; //状态标志 dblocptr->temppush.latitudeH=0; //纬度 dblocptr->temppush.latitudeL=0; //纬度 dblocptr->temppush.longitudeH=0; //经度 dblocptr->temppush.longitudeL=0; //经度 dblocptr->temppush.height=0; //高度 dblocptr->temppush.speed=0; //速度 dblocptr->temppush.direction=0; //方向 dblocptr->temppush.timeBCD[0]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[1]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[2]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[3]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[4]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[5]=0; //时间戳(世纪秒)BCD dblocptr->temppush.signalCmd=0; //信号关键字 dblocptr->temppush.signalCmd_len=0; //信号关键字长度 dblocptr->temppush.CSQ=0; //信号强度 dblocptr->temppush.atellitesCmd=0; //卫星关键字 dblocptr->temppush.atellitesCmd_len=0;//卫星关键字长度 dblocptr->temppush.satellitesNum=0; //卫星数量 } else { PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17); TestPrintStruct(dblocptr,1,0);//读取Temp dblocptr->headinfo.loc_pushIndex+=1; dblocptr->headinfo.loc_Conter+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度 } } else if(timecount==4)//20min最少一条 { timecount=0; Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pushIndex-1)*34),17);//读取body信息 if(dblocptr->temppush.alarmFlagH==0xFFFF) { dblocptr->temppush.alarmFlagH=0; dblocptr->temppush.alarmFlagL=0; dblocptr->temppush.statusFlagH=0; //状态标志 dblocptr->temppush.statusFlagL=0; //状态标志 dblocptr->temppush.latitudeH=0; //纬度 dblocptr->temppush.latitudeL=0; //纬度 dblocptr->temppush.longitudeH=0; //经度 dblocptr->temppush.longitudeL=0; //经度 dblocptr->temppush.height=0; //高度 dblocptr->temppush.speed=0; //速度 dblocptr->temppush.direction=0; //方向 dblocptr->temppush.timeBCD[0]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[1]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[2]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[3]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[4]=0; //时间戳(世纪秒)BCD dblocptr->temppush.timeBCD[5]=0; //时间戳(世纪秒)BCD dblocptr->temppush.signalCmd=0; //信号关键字 dblocptr->temppush.signalCmd_len=0; //信号关键字长度 dblocptr->temppush.CSQ=0; //信号强度 dblocptr->temppush.atellitesCmd=0; //卫星关键字 dblocptr->temppush.atellitesCmd_len=0;//卫星关键字长度 dblocptr->temppush.satellitesNum=0; //卫星数量 } else { PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17); TestPrintStruct(dblocptr,1,0);//读取Temp dblocptr->headinfo.loc_pushIndex+=1; dblocptr->headinfo.loc_Conter+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度 } } else if(dblocptr->headinfo.loc_pushIndex==0)//判断是否写入 { PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart,17);//34 if(PushSta==HAL_OK) { printf("首次写入,->%d\r\n",dblocptr->temppush.loc_pushIndex); } dblocptr->headinfo.loc_pushIndex+=1; //入库索引 dblocptr->headinfo.loc_Conter+=1; //入库总计数 Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//向dblocptr->headinfo写入6*2个字节 Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.loc_pushIndex),LocDbHeadStart,6);//读取 } } if(dblocptr->headinfo.loc_pushIndex == dblocptr->headinfo.loc_pushSize)//入库达边界值 { Overwrite_loc=true; dblocptr->headinfo.loc_pushIndex=0; printf("@@入库操作,当前索引%d,达边界值返回覆写----%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_Conter); Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度 } // if(dblocptr->location.latitudeL!=0) // { TestPrintStruct(dblocptr,0,0);//读取Worknow Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.loc_pushIndex),LocDbHeadStart,4);//读取loc头部写入信息 // if(PushSta==HAL_OK) // { printf("写入%d完成,准备写入->%d\r\n",dblocptr->headinfo.loc_pushIndex-1,dblocptr->temppush.loc_pushIndex); // } // } ///*越界处理 } void Database_Pull(uint8_t object) { if(object==0)//位置信息出库 { Flash_ReadBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,6);//读取loc头部写入信息 if(dblocptr->headinfo.loc_pushIndex != dblocptr->headinfo.loc_pullIndex)//库内有数据 { if(Overwrite_loc) { if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pushSize) { dblocptr->headinfo.loc_pullIndex=0; } else { dblocptr->headinfo.loc_pullIndex = dblocptr->headinfo.loc_pushIndex+1; printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex); Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 //TestPrintStruct(dblocptr,2,1);//读取pullTemp //dblocptr->headinfo.loc_pullIndex+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度 } if(dblocptr->headinfo.loc_pullIndex < dblocptr->headinfo.loc_pushIndex) { printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex); Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 //TestPrintStruct(dblocptr,2,1);//读取pullTemp dblocptr->headinfo.loc_pullIndex+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度 } } else { printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex); Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 //TestPrintStruct(dblocptr,2,1);//读取pullTemp dblocptr->headinfo.loc_pullIndex+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度 } } else { printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex); dblocptr->headinfo.loc_pushIndex=0; dblocptr->headinfo.loc_pullIndex=0; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度 printf("@@出库完成,库内数据更新\r\n"); Online=false; } } } void TestPrintStruct(DatabaseLoc *ptr,uint8_t temppush,uint8_t temppull) { if(temppush==1) { printf("temp:%04X%04X%04X%04X%04X%04X%04X%04X%04X%04X%04X%d%d%d%d%d%d%02X%02X%02X%02X%02X%02X\r\n", \ ptr->temppush.alarmFlagH, \ ptr->temppush.alarmFlagL, \ ptr->temppush.statusFlagH, \ ptr->temppush.statusFlagL, \ ptr->temppush.latitudeH, \ ptr->temppush.latitudeL, \ ptr->temppush.longitudeH, \ ptr->temppush.longitudeL, \ ptr->temppush.height, \ ptr->temppush.speed, \ ptr->temppush.direction, \ ptr->temppush.timeBCD[0], \ ptr->temppush.timeBCD[1], \ ptr->temppush.timeBCD[2], \ ptr->temppush.timeBCD[3], \ ptr->temppush.timeBCD[4], \ ptr->temppush.timeBCD[5], \ ptr->temppush.signalCmd, \ ptr->temppush.signalCmd_len, \ ptr->temppush.CSQ, \ ptr->temppush.atellitesCmd, \ ptr->temppush.atellitesCmd_len, \ ptr->temppush.satellitesNum); } else if(temppush==0) { printf("now:%04X%04X%04X%04X%04X%04X%04X%04X%04X%04X%04X%d%d%d%d%d%d%02X%02X%02X%02X%02X%02X\r\n", \ ptr->location.alarmFlagH, \ ptr->location.alarmFlagL, \ ptr->location.statusFlagH, \ ptr->location.statusFlagL, \ ptr->location.latitudeH, \ ptr->location.latitudeL, \ ptr->location.longitudeH, \ ptr->location.longitudeL, \ ptr->location.height, \ ptr->location.speed, \ ptr->location.direction, \ ptr->location.timeBCD[0], \ ptr->location.timeBCD[1], \ ptr->location.timeBCD[2], \ ptr->location.timeBCD[3], \ ptr->location.timeBCD[4], \ ptr->location.timeBCD[5], \ ptr->location.signalCmd, \ ptr->location.signalCmd_len, \ ptr->location.CSQ, \ ptr->location.atellitesCmd, \ ptr->location.atellitesCmd_len, \ ptr->location.satellitesNum); } else if(temppull==1) { printf("ptem:%04X%04X%04X%04X%04X%04X%04X%04X%04X%04X%04X%d%d%d%d%d%d%02X%02X%02X%02X%02X%02X\r\n", \ ptr->temppull.alarmFlagH, \ ptr->temppull.alarmFlagL, \ ptr->temppull.statusFlagH, \ ptr->temppull.statusFlagL, \ ptr->temppull.latitudeH, \ ptr->temppull.latitudeL, \ ptr->temppull.longitudeH, \ ptr->temppull.longitudeL, \ ptr->temppull.height, \ ptr->temppull.speed, \ ptr->temppull.direction, \ ptr->temppull.timeBCD[0], \ ptr->temppull.timeBCD[1], \ ptr->temppull.timeBCD[2], \ ptr->temppull.timeBCD[3], \ ptr->temppull.timeBCD[4], \ ptr->temppull.timeBCD[5], \ ptr->temppull.signalCmd, \ ptr->temppull.signalCmd_len, \ ptr->temppull.CSQ, \ ptr->temppull.atellitesCmd, \ ptr->temppull.atellitesCmd_len, \ ptr->temppull.satellitesNum); } } uint16_t timecountSec=0; uint16_t timecountMin=0; uint16_t timecount=0; void PushpullWork(void) { #if timingPush==1 //if(Offline && timecountMin==5)//5min入库一个信息 if(Offline && timecountMin==1)//1min入库一个信息 #else if(Offline)//入库 #endif { timecountMin=0;//5min清0 Database_Push(0);//0:Loc信息 } else if(!Offline && Online) { Database_Pull(0); tt808FsFunc((uint8_t*)&(dblocptr->temppull.alarmFlagH), 39, MessageID_Retrans); } }