#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; //***************定位信息入库 bool twowrite = false; //*20min最少一条 //*大于10km每5min一条 void Database_Push(uint8_t object) { if(object==0)//位置信息写入 { printf("@1->%d\r\n",dblocptr->headinfo.loc_pushIndex); #if timingPush==1 if(dblocptr->headinfo.loc_pushIndex!=0 && dblocptr->location.speed>100)//速度大于10km/h入库(100) #else if(dblocptr->temppush.loc_pushIndex!=0 && dblocptr->location.speed>100)//速度大于10km/h入库 #endif { printf("2\r\n"); PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17); 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)//判断是否初次写入 { printf("3\r\n"); PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart,17);//34 if(PushSta==HAL_OK) { printf("区头开始写入\r\n"); } dblocptr->headinfo.loc_pushIndex+=1; //入库索引 dblocptr->headinfo.loc_Conter+=1; //入库总计数 Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//向dblocptr->headinfo写入6*2个字节 } else if(timecount==4)//20min最少一条 { printf("4\r\n"); timecount=0; PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17); dblocptr->headinfo.loc_pushIndex+=1; dblocptr->headinfo.loc_Conter+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度 } else { printf("5\r\n"); printf("未获取定位信息\r\n"); } } if(dblocptr->headinfo.loc_pushIndex == dblocptr->headinfo.loc_pushSize)//入库达边界值 { printf("6\r\n"); 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->headinfo.loc_pushIndex>0) { printf("7\r\n"); printf("写入%d完成,准备写入->%d\r\n",dblocptr->headinfo.loc_pushIndex-1,dblocptr->headinfo.loc_pushIndex); } } bool lastPull = false; void Database_Pull(uint8_t object) { if(object==0)//位置信息出库 { printf("1\r\n"); Flash_ReadBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,6);//读取loc头部写入信息 if(dblocptr->headinfo.loc_pushIndex != dblocptr->headinfo.loc_pullIndex)//库内有数据 { printf("2\r\n"); printf("库内有数据\r\n"); if(Overwrite_loc) { printf("3\r\n"); printf("库内已被覆写\r\n"); if(dblocptr->headinfo.loc_pullIndex==0 && dblocptr->headinfo.loc_Conter>dblocptr->headinfo.loc_pullSize && !lastPull)//当前入库后的一组数据 { printf("4\r\n"); twowrite = true; printf("更新pullIndex\r\n"); dblocptr->headinfo.loc_pullIndex = dblocptr->headinfo.loc_pushIndex+1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 } else if(dblocptr->headinfo.loc_pullIndex < dblocptr->headinfo.loc_pushIndex)//置0后 { printf("5\r\n"); 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信息 dblocptr->headinfo.loc_pullIndex+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 } else if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pushIndex)//置0后 { printf("6\r\n"); printf("@@0后出库操作,当前索引%d\r\n",dblocptr->headinfo.loc_pullIndex); Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 dblocptr->headinfo.loc_pullIndex+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 } } else { printf("7\r\n"); printf("库内未被覆写,出库\r\n"); Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 dblocptr->headinfo.loc_pullIndex+=1; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 } } if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pullSize)//到达界限 { printf("8\r\n"); twowrite = false; lastPull = true; dblocptr->headinfo.loc_pullIndex=0; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 } if(dblocptr->headinfo.loc_pushIndex == dblocptr->headinfo.loc_pullIndex && Overwrite_loc && dblocptr->headinfo.loc_Conter>=dblocptr->headinfo.loc_pushSize) //相同已返回总计数大于入库限制 { printf("9\r\n"); printf("库内有数据并且都在头\r\n"); printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex); dblocptr->headinfo.loc_pullIndex=dblocptr->headinfo.loc_pushIndex +1; Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息 Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 } { printf("10\r\n"); printf("@@出库操作当前索引%d\r\n",dblocptr->headinfo.loc_pullIndex); if(dblocptr->headinfo.loc_pullIndex == dblocptr->headinfo.loc_pullSize) { printf("11\r\n"); dblocptr->headinfo.loc_pushIndex=0; dblocptr->headinfo.loc_pullIndex=0; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 printf("@@出库完成,库内数据更新!!!!\r\n"); Online=false; lastPull=false; Overwrite_loc=false; } if(dblocptr->headinfo.loc_pullIndex == dblocptr->headinfo.loc_pushIndex) { printf("12\r\n"); dblocptr->headinfo.loc_pushIndex=0; dblocptr->headinfo.loc_pullIndex=0; Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度 printf("@@出库完成,库内数据更新!!!!\r\n"); Online=false; lastPull=false; Overwrite_loc=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) { dblocptr->location.statusFlagL = (0x2<<8)&0xFF00;//定义状态 #if timingPush==1 //if(Offline && timecountMin==5)//5min入库一个信息 if(Offline && timecountMin==1)//1min入库一个信息 #endif { timecountMin=0;//5min清0 Database_Push(0);//0:Loc信息 } else if(!Offline && Online) { Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart,17);//读取出库body信息 if(lastPull) { //lastPull=false; } else if(dblocptr->temppull.alarmFlagH!=0xFFFF) { printf("库内无有效数据\r\n"); Database_Pull(0);//读取 tt808FsFunc((uint8_t*)&(dblocptr->temppull.alarmFlagH), 39, MessageID_Retrans);//上传 } } }