📄 predictor.c
字号:
{
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 + -