⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 predictor.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 3 页
字号:
{
     
     INT8U  endstanum;
     INT16U curindex;    
    
     StartTmr(MainSearchTmr, MainSearchPeriod);

     DirectorbyLedLight();                                             //指示GPS定位状态或模拟跑车状态
         
     DeclareOnStartRun();                                              //起步提醒     
     DeclareOnExactTime();                                             //整点报时
  
     if(!GetGpsData(&Gpsdata))                                         //获取位置数据
     {
        Status = 0;
        return;
     }
     
     Index_Line = GetLineIndex_Memory();                               //获取当前线路数据的存储索引
     
     DeclareOnObjectsFound();                                          //发现拐弯、上坡、下坡等特定道路状态提醒
     
     if(!SearchBusStation(&Station_Searched))                         //未发现站点,则返回
     {
        return;
     }
   
     if(IsStationArrived())   
     {
          StationID_Last = MemIndex;
          StationID_Cur  = MemIndex;
          StationID_Next = MemIndex+2;
          
          if(StationID_Cur % 2)
          {
              curindex = StationID_Cur /2 + Curstation_Tbl.nums_up;
          }
          else
          {
              curindex = StationID_Cur /2;
          }
          
          if((CurLine.cell[StationID_Cur].cur != SpecailStation.start_sta1)&&(CurLine.cell[StationID_Cur].cur != SpecailStation.start_sta2))
          {  
               OSQPost(AlmTaskMsgQue, MSG_BUSSTATION_STATIONARIVED, CurLine.cell[StationID_Cur].cur, CurLine.cell[StationID_Cur].next);
               OSQPost(DisplayTaskQ, MSG_DISPLAYTASK_ID,curindex,0); 
          }
     }
              
     if(IsStationBeginDepart())                                        //开始出站
     {
          if(!(Status & IS_BEGIN_LEAVE))
          {
               Status |= IS_BEGIN_LEAVE;
          } 
     }
     
     if(Status & IS_BEGIN_LEAVE)
     {
          if(!(Status & IS_LEFT_STATION))
          {
              Status &= ~IS_BEGIN_LEAVE;
              
              if(StationID_Cur%2)                                      //偶数为上行,奇数为下行
              {
                 endstanum =  SpecailStation.end_sta2;
                 LineDirection = DOWMSTREAM; 
              }
              else
              {
                 endstanum =  SpecailStation.end_sta1;
                 LineDirection = UPSTREAM;
              }
                                        
              OSQPost(AlmTaskMsgQue, MSG_BUSSTATION_STATIONSTART, CurLine.cell[StationID_Cur].next ,endstanum);
             
          }
     }
     
      
}

static void AssiSearchProc(void)
{
     INT8U i;
     INT8U ad_id;
     INT32U space;
     
    
     
     if(!GetGpsData(&Gpsdatum))                                         //获取位置数据
     {
        return;
     }
     
     for( i=0;i<AdObjectPara.nums;i++)
     {
         if(Status & IS_FOUND_ADOBJ)
         {
             break;
         }
         
         space = CalculateGpsSpace(Gpsdatum.latitude, Gpsdatum.longitude,AdObjectPara.object[i].pos.latitude,AdObjectPara.object[i].pos.longitude);
         
         if(space < ALARM_LEN_ADOBJFOUND)
         {
             if(!(Status & IS_FOUND_ADOBJ))
             {
                  Status |= IS_FOUND_ADOBJ;
                  
                  ad_id = AdObjectPara.object[i].AD_id;
                  
                  memcpy((INT8U*)&AdObj,(INT8U*)&AdObjectPara.object[i],sizeof(ADOBJECT_STR));
                  
                  if( AdObj.status == AOPEN_)
                  {
                        OSQPost(AlmTaskMsgQue, MSG_OBJECT_ADOBJ,ad_id,0);  
                  }
             }    
         }
     }
     
     if(Status & IS_FOUND_ADOBJ)
     {
           if(CalculateGpsSpace(Gpsdatum.latitude, Gpsdatum.longitude,AdObj.pos.latitude,AdObj.pos.longitude)>ALARM_LEN_ADOBJFOUND)
           {
                Status &=~IS_FOUND_ADOBJ; 
           }
     }
       
       
       
}

void SearchBusStationInit(void)
{

      Status               = 0;
      Index_Line           = 0;
      Count_Station_Search = 0;
      
      StationID_Last       = -1;
      StationID_Cur        = -1;
      StationID_Next       = -1;
      CurLine.nums         = 0;
      
      AutoValid = FALSE;
      LineDirection = -1;
      InitLedLightPara();
      
      if(PubParaValid(CURSTATBL_))
      {
          AssambleBusLineWithStations();
      }
      
      MainSearchTmr = CreateTimer(MainSearchProc, 0);
      StartTmr(MainSearchTmr, MainSearchPeriod);
      
      AssiSearchTmr = CreateTimer(AssiSearchProc, 0);
      StartTmr(AssiSearchTmr, AssiSearchPeriod);
     
}


//  把站点数据组装到公交线路结构上去
void AssambleBusLineWithStations(void)
{
     INT8U i,j;
     
     CurLine.nums = Curstation_Tbl.nums_up + Curstation_Tbl.nums_down;
     
     for(i=0;i<Curstation_Tbl.nums_up;i++)
     {
         if(i==0)
         {
            CurLine.cell[2*i].last = 0xffff;
         }
         else
         {
            CurLine.cell[2*i].last = Curstation_Tbl.sta_line[i-1].Stanum;
         }
         
         CurLine.cell[2*i].cur  = Curstation_Tbl.sta_line[i].Stanum;
         
         if(i== Curstation_Tbl.nums_up-1)
         {
            CurLine.cell[2*i].next =0xffff;
         }
         else
         {
            CurLine.cell[2*i].next = Curstation_Tbl.sta_line[i+1].Stanum;
         }
     }
     
     for(i=0;i<Curstation_Tbl.nums_down;i++)
     {
        j = i+Curstation_Tbl.nums_up;
        
        if(i==0)
         {
            CurLine.cell[2*i+1].last = 0xffff;
         }
         else
         {
            CurLine.cell[2*i+1].last = Curstation_Tbl.sta_line[j-1].Stanum;
         }
         
         CurLine.cell[2*i+1].cur  = Curstation_Tbl.sta_line[j].Stanum;
         
         if(i== Curstation_Tbl.nums_down-1)
         {
            CurLine.cell[2*i+1].next =0xffff;
         }
         else
         {
            CurLine.cell[2*i+1].next = Curstation_Tbl.sta_line[j+1].Stanum;
         }  
     }
}
//  规划线路站点数据
INT8U LayoutStation_Line(INT16U linenum)
{
      INT8U         i;
      INT8U         j;
      INT16U        nums;
      INT16U        stationid;
      TBLCELL_STR    linecell,stationcell;
      OFFSET1_STR    offset;
       
      nums = CountObjectDots(LINE_TABLE);
      
      for(i=0;i<nums;i++)
      {
           ReadTableCellFromFlash(LINE_TABLE,i,sizeof(TBLCELL_STR),(INT8U*)&linecell);
           
                      
           if(linecell.first == linenum)
           {
                LineNumPara.linenumber    = linecell.first;
                LineNumPara.index         = linecell.second;
                VirStorePubPara(LINENUM_);
                break;
           }
          
      }
      
      if(i== nums)
      {
           return  NOLINE;
      }
      
#if DEBUG_UARTNo_BUSSTATION  <=1 
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nLineNumPara.index:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,LineNumPara.index);
#endif      
      ReadRecFromFlash(OFFSET_STA,LineNumPara.index,sizeof(OFFSET1_STR), (INT8U*)&offset);
      
      Curstation_Tbl.nums_up    =  offset.nums_up;
      Curstation_Tbl.nums_down  =  offset.nums_down;

#if DEBUG_UARTNo_BUSSTATION  <=1 
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\noffset.nums_up:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,offset.nums_up);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\noffset.nums_down:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,offset.nums_down);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\noffset.pos:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,offset.pos);
#endif
      
      ReadRecFromFlash(NUMBER_STA, offset.pos,2, (INT8U*)&stationid);
      SpecailStation.start_sta1 = stationid;
      ReadRecFromFlash(NUMBER_STA, (offset.pos+offset.nums_up-1),2, (INT8U*)&stationid);
      SpecailStation.end_sta1   = stationid;
      ReadRecFromFlash(NUMBER_STA, (offset.pos+offset.nums_up),2, (INT8U*)&stationid);
      SpecailStation.start_sta2 = stationid;
      ReadRecFromFlash(NUMBER_STA, (offset.pos+offset.nums_up+offset.nums_down-1),2, (INT8U*)&stationid);
      SpecailStation.end_sta2   = stationid;

#if DEBUG_UARTNo_BUSSTATION  <=1 
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nSpecailStation.start_sta1:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.start_sta1>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.start_sta1);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nSpecailStation.end_sta1:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.end_sta1>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.end_sta1);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nSpecailStation.start_sta2:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.start_sta2>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.start_sta2);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nSpecailStation.end_sta2:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.end_sta2>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,SpecailStation.end_sta2);
#endif     
          
      VirStorePubPara(SPECIALSTA_);
       
      for(i=0;i<offset.nums_up +offset.nums_down ;i++)
      {
           ReadRecFromFlash(NUMBER_STA, offset.pos++,2, (INT8U*)&stationid);
           
           Curstation_Tbl.sta_line[i].Stanum = stationid;
           
           nums = CountObjectDots(STATION_TABLE);
           
           for ( j=0;j<nums;j++)
           {
                ReadTableCellFromFlash(STATION_TABLE,j,sizeof(TBLCELL_STR),(INT8U*)&stationcell);
                
                if(stationcell.first == stationid)
                {
                     Curstation_Tbl.sta_line[i].AD_id = stationcell.second;
                     break; 
                }
                
                 
           }
           
           if (j==nums)
           {
               return NOSTATION;
           }
      }
      
      AssambleBusLineWithStations();
#if DEBUG_UARTNo_BUSSTATION  <=1 
     PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nCurLine.nums");
     SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION,CurLine.nums);
     PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\n");
     SendFromUART_MEM_HEX(DEBUG_UARTNo_BUSSTATION,(INT8U*)CurLine.cell, CurLine.nums*6);
     
#endif   
      
      StorePubPara(CURSTATBL_);
      
      return SUCCESS;
       
}

void HdlManualRepeat(void)
{
#if DEBUG_UARTNo_BUSSTATION  <=1 
     PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\n重拨当前语音");
#endif  
     OSQPost(AlmTaskMsgQue, AlmCurMsg.MsgID, AlmCurMsg.LMsgPara ,0);
}

void HdlManualRongji(void)
{
     OSQPost(AlmTaskMsgQue,MSG_BUSSWORDS_RONGJI, 0 ,0);
}

void HdlManualRangzuo(void)
{
     OSQPost(AlmTaskMsgQue,MSG_BUSSWORDS_RANGZUO, 0 ,0); 
}


INT16U GetADNums(INT16U nums1)
{
     INT8U  temp1;
     INT8U  temp2;
     INT16U sta_nums;
     INT16U ad_max;
     
     ReadRecFromFlash(NUMS_STA, 0,2, (INT8U*)&sta_nums);
     
     if(PubParaValid(ADOBJ_))
     {
         temp1 = AdObjectPara.nums;
     }
     else
     {
          temp1 = 0;
     }
     
     if(PubParaValid(ADVOICEID_))
     {
         temp2 = AdVoiceIDPara.nums;
     }
     else
     {
          temp2 = 0;
     }
        
     ad_max = sta_nums + temp1 + temp2 + nums1;

#if 0
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nnums1:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,nums1>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,nums1);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nsta_nums:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,sta_nums>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,sta_nums);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\ntemp1:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION, temp1);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\ntemp2:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION, temp2);
      PrintFromUART(DEBUG_UARTNo_BUSSTATION , "\nad_max:");
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,ad_max>>8);
      SendFromUART_HEX(DEBUG_UARTNo_BUSSTATION ,ad_max);
 
#endif
     
     return ad_max;
     
}

INT16U GetADVoice1(INT16U nums1)
{
     INT16U sta_nums;
     INT16U ad_max;
     
     ReadRecFromFlash(NUMS_STA, 0,2, (INT8U*)&sta_nums);
     
     ad_max = sta_nums + nums1;
     
     return ad_max;
}

INT16U GetADVoice2(INT16U nums1)
{
     INT16U sta_nums;
     INT16U ad_max;
     INT8U  temp;
     
     ReadRecFromFlash(NUMS_STA, 0,2, (INT8U*)&sta_nums);
     
     if(PubParaValid(ADVOICEID_))
     {
         temp = AdVoiceIDPara.nums;
     }
     else
     {
         temp = 0;
     }
     ad_max = sta_nums + nums1 +temp;
     
     return ad_max;
}

void  OpenIndicator(void)
{
    InstallPermnentPort(LEDPARA_GPSVALID); 
}

void CloseIndicator(void)
{
    RemovePermnentPort(PORT_LEDGREEN); 
}

INT8U OperateMachine(void)
{
   if(!(Status & IS_MACHINE_CLOSE))
   {
       StopTmr(MainSearchTmr);
       StopTmr(AssiSearchTmr);
      
       RemovePermnentPort(PORT_LEDGREEN);
       RemovePermnentPort(PORT_LEDRED);
       Status |= IS_MACHINE_CLOSE;
       return 0;
   }
   else
   {
       StartTmr(MainSearchTmr, MainSearchPeriod);
       StartTmr(AssiSearchTmr, AssiSearchPeriod);
      
              
       if(IsWorkAuto())
       { 
           InstallPermnentPort(LEDPARA_GPSVALID);
       }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -