📄 djk.c
字号:
#include <stdlib.h>
#include <dos.h>
#include <mem.h>
#include <time.h>
#include <string.h>
#include "namedef.h"
#include "datadef.h"
#include <stdio.h>
//#include <string.h>
//#include <conio.h>
//#include <math.h>
//#include <bios.h>
//注意在程序中不要使用浮点运算
#include "djk.h"
#include "rs232.h"
#include "djktime.h"
#include "rs485.h"
#include "station.h"
#include "can.h"
#define BASEIO 0x88//0x306//0x88//0x306//
typedef struct {
unsigned char year;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
}GPS;
enum SGCOLOR{SGDEFUALT,SGWHITE,SGGREEN};
unsigned char senddis=0; //发送摘挂点距离吗?0=n,1=y
unsigned char shouldjoin=0;//过点应该入网吗?d8=1y,d8=0n,d0=入网方向0为上行1为下行
static int drctchanged=0;//方向改变了吗1=y
static unsigned char allowcontrol=0;//g93是否进入调车状态
static unsigned char gooutstation=0;//是否正在出集中区
static unsigned char selfcontrol=0;//d7是否在尽头线防护模式,d6是否需要防护,d0防护方向0=上行1=下行
static unsigned char affirmdc=0;//司机确认调车
static unsigned char dcstate=0; //g93在调车状态吗
static unsigned char slide=0;//溜车标志
static unsigned char displacementdrct=0;//上行时位移在增加还是在减少?0=未知,1=增加,2=减少
static unsigned char firstindj=0;//0==第一次进入调监,!0==否
static unsigned char needconfirm;//D7:!0=需要显示确认提示 0=不需要
extern unsigned int timer;
extern PORT *com1;
extern PORT *com2;
extern PORT *com3;
extern PORT *com4;
GPS gps;
static unsigned char rcvstr[256];
static unsigned char sendstr[32];
static unsigned char G93_Rcv_Str[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},G93_Finished=0;
static unsigned char G93_Snd_Str[17]={0x3c,0xc8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc};
//head,rcv success,.... ,check=not(sum(1~16))+1
unsigned int Station_Timer=0;
unsigned int Route_Timer=0;
unsigned int JlDl_Timer=0;
unsigned char StationError=0;
unsigned int G93RcvTimer=0;
extern TRAIN train;
extern STATION station;
extern JOBLIST joblist;
extern ROUTE route1;
extern ROUTE routepre;
extern DCLIMIT dclimit;
extern DCLIMIT savedl;
extern CAN_TYPE *can[2];
extern int CreateRoute(ROUTE *rt,unsigned int id);
extern void CheckOutDc(int cmd);
void G2000_Can(int id,unsigned char cmd);
void G93_ShowInfor(int id,unsigned char cmd);
void G2000_ShowJob(int cmd);
unsigned char GetBit(unsigned char data,int src,int dst);
void Check_ShouldJoin(int id);
int CacJoinLength(int cmd);
void CheckStation(int cmd,int data);
int CacBackSigDis(int cmd,int direction);
extern int GetJoinRoute(int *track,int *node,BASEROUTE *pbase,int direction);
//int CacJoinLength(int cmd);
#define BcdToHex(b) ((b>>4)*10+(b&0x0f))
void MyGetDate(struct date *pda)//取当前日期,即录用的时间到nvram,能存贮384kbyte
{
unsigned char c;
outportb(0x70,9);
c=inportb(0x71);
pda->da_year=BcdToHex(c);
outportb(0x70,8);
c=inportb(0x71);
pda->da_mon=BcdToHex(c);
outportb(0x70,7);
c=inportb(0x71);
pda->da_day=BcdToHex(c);
}
void MyGetTime(struct time *pti)//取时间
{
unsigned char c;
outportb(0x70,4);
c=inportb(0x71);
pti->ti_hour=BcdToHex(c);
outportb(0x70,2);
c=inportb(0x71);
pti->ti_min=BcdToHex(c);
outportb(0x70,0);
c=inportb(0x71);
pti->ti_sec=BcdToHex(c);
}
int GetPass(unsigned int early,unsigned int late)//区两个记时器early自己 ,记录时间 late 比较的系统时间,
{
int i;
if(late>=early)
i=late-early;
else
i=65536-early+late;
return i;
}
void SetJlDate(int id)//设置记录的日期
{
char cmpstr[16];
int i;
struct date curdate;
struct time curtime;
unsigned int pageno,pageadress;
unsigned int dataadress,datalen;
datalen=peek(DCM_SEG,DCM_OFF+4);
dataadress=peek(DCM_SEG,DCM_OFF+6);
pageno=dataadress/2048+5;
pageadress=dataadress%2048;
pageadress=pageadress*16;
if(datalen<22528)
{
datalen++;
poke(DCM_SEG,DCM_OFF+4,datalen);
}
if(dataadress<22527)
dataadress++;
else
dataadress=1;
poke(DCM_SEG,DCM_OFF+6,dataadress);
MyGetTime(&curtime);
MyGetDate(&curdate);
cmpstr[0]=curdate.da_mon;
cmpstr[1]=curdate.da_day;
cmpstr[2]=0;
cmpstr[3]=curtime.ti_hour;
cmpstr[4]=curtime.ti_min;
cmpstr[5]=curtime.ti_sec;
cmpstr[6]=curdate.da_year>>8;
cmpstr[7]=curdate.da_year&0xff;
cmpstr[8]=id;
if(pageno<5 || pageno>=16)
return;
outportb(DCM_PORT,pageno);//
outportb(DCM_PORT,pageno);
outportb(DCM_PORT,pageno);
for(i=0;i<9;i++)
pokeb(DCM_SEG,DCM_OFF+pageadress+i,cmpstr[i]);
}
void ChkDataStart(void)//设置系统启动时,检查以前记录起始地址
{
char cmpstr[16];
int i;
outportb(DCM_PORT,5);//data start
outportb(DCM_PORT,5);
outportb(DCM_PORT,5);
for(i=0;i<4;i++)
cmpstr[i]=peekb(DCM_SEG,DCM_OFF+i);
if(cmpstr[0]!='S' || cmpstr[1]!='V' || cmpstr[2]!='D' || cmpstr[3]!='J')
{
cmpstr[0]='S';cmpstr[1]='V';cmpstr[2]='D';cmpstr[3]='J';//SVDJ标志
for(i=0;i<4;i++)
pokeb(DCM_SEG,DCM_OFF+i,cmpstr[i]);
poke(DCM_SEG,DCM_OFF+4,1);//长度
poke(DCM_SEG,DCM_OFF+6,1);//起始地址
poke(DCM_SEG,DCM_OFF+8,0);//年
}
SetJlDate(1);
}
void SaveData(int sort,unsigned char *data)//记录数据到文件
{
static unsigned char jldata[52];//每次存煮16哥字节有效数据
unsigned int pageno,pageadress;
unsigned int dataadress,datalen;
unsigned char jlhead[3];//日期时间,shi 5 fen 6 miao 6 leixing 从参数设置 7位
struct date curdate;
struct time curtime;
int i,j;
//if(sort<1 || sort>6)
// return;
//if(!memcmp(jldata+12*(sort-1),data,12))
// return;
if(train.netstate==0 && sort<4)
return;
switch(sort)//sort 类型变量,函数的参数表
{
case 1://g2000 r
if(data[5]==jldata[5] && data[7]==jldata[7] && data[10]==jldata[10])
return;
memcpy(jldata,data,13);//接受到2000的数据
break;
case 2://g2000 s
if(!memcmp(data,jldata+13,10))
{
return;
}
memcpy(jldata+13,data,10);//发给2000的数据
break;
case 3://radio r
jldata[37]=data[11];
if(!memcmp(jldata+26,data,13))
return;
memcpy(jldata+26,data,13);
break;
case 4://state
if(data[0]==1 && data[0]==jldata[39])
return;
memcpy(jldata+39,data,13);
break;
default:
return;
}
//总共时512k,每页32k
outportb(DCM_PORT,5);//data start
outportb(DCM_PORT,5);
outportb(DCM_PORT,5);
datalen=peek(DCM_SEG,DCM_OFF+4);//存
dataadress=peek(DCM_SEG,DCM_OFF+6);//cun ru shuju de 下一次存贮地址
pageno=dataadress/2048+5;//每页32k,从第五页开始存贮记录,前5页现在时空闲
pageadress=dataadress%2048;
pageadress=pageadress*16;//每条是16字节
if(datalen<22528)//小于384k/16
{
datalen++;
poke(DCM_SEG,DCM_OFF+4,datalen);//更新一下记录条数
}
if(dataadress<22527)
dataadress++;
else
dataadress=1;
poke(DCM_SEG,DCM_OFF+6,dataadress);//DCM_OFF+6 记录下一此写的地址
MyGetTime(&curtime);
jlhead[0]=curtime.ti_hour<<3;
jlhead[0]|=(curtime.ti_min>>3)&0x07;
jlhead[1]=(curtime.ti_min<<5)&0xe0;
jlhead[1]|=curtime.ti_sec>>1;
jlhead[2]=curtime.ti_sec<<7;
jlhead[2]|=sort &0x7F;//
if(pageno<5 || pageno>=16)
return;
outportb(DCM_PORT,pageno);//
outportb(DCM_PORT,pageno);
outportb(DCM_PORT,pageno);
for(i=0;i<3;i++)
pokeb(DCM_SEG,DCM_OFF+pageadress+i,jlhead[i]);
for(i=0;i<13;i++)
pokeb(DCM_SEG,DCM_OFF+pageadress+3+i,jldata[i+(sort-1)*13]);
if(sort==2)//在给2000发送数据加入日期数据
{
MyGetDate(&curdate);
pokeb(DCM_SEG,DCM_OFF+pageadress+3+10,curdate.da_mon);
pokeb(DCM_SEG,DCM_OFF+pageadress+3+11,curdate.da_day);
pokeb(DCM_SEG,DCM_OFF+pageadress+3+12,curdate.da_year);
}
//outportb(DCM_PORT,0);
}
void SaveState(int id)//过点 1,电台故障 ,yu 2000tongxing guzhang ,点式故障
{
unsigned char data[13];
data[0]=id;
data[1]=train.isingudao;
data[2]=train.forlight;
SaveData(4,data);
}
void SavePoint(int id)
{
unsigned char data[13];
data[0]=9;
data[1]=id;
data[2]=train.g93trend;
data[3]=train.netstate;
data[4]=StationError;
data[5]=train.error;
SaveData(4,data);
}
void SaveG2kData(int zhh,unsigned char *data)
{
static unsigned char cpdata[13];
if(1!=train.netstate && 2!=train.netstate)
return;
if(zhh==3)
{
cpdata[8]=data[0];
cpdata[9]=data[1];
cpdata[10]=data[2];
cpdata[11]=data[3];
}
else if(zhh==1)
{
memcpy(cpdata,data,8);
SaveData(1,cpdata);
}
}
void GetCurTime(void)
{
struct time curtime;
struct date curdate;
MyGetTime(&curtime);
MyGetDate(&curdate);
gps.year=curdate.da_year%2000;
gps.month=curdate.da_mon;
gps.day=curdate.da_day;
gps.hour=curtime.ti_hour;
gps.minute=curtime.ti_min;
gps.second=curtime.ti_sec;
}
int CacOutRevDis(int id,unsigned char cmd)
{
static int PreDis=0;
static int OutRevDis=0;
static unsigned char PreOut=0;//是否正在出集中区b
switch(id)
{
case 1:
if((!PreOut) && gooutstation)
{
if(train.passrevdis!=-1)
OutRevDis=abs(train.displacement-train.passrevdis);
else
OutRevDis=-1;
PreOut=gooutstation;
PreDis=train.displacement;
}
break;
case 2:
if((!PreOut) && gooutstation)
{
if(train.g93forltdis>0)
OutRevDis=train.g93forltdis;
else
OutRevDis=-1;
PreOut=gooutstation;
PreDis=train.displacement;
}
break;
case 3:
if(gooutstation && train.netstate==2 && OutRevDis!=-1)
{
if(cmd>0)
{
OutRevDis+=abs(train.displacement-PreDis);
}
PreDis=train.displacement;
}
PreOut=gooutstation;
break;
case 4:
if(gooutstation && train.netstate==2)
{
OutRevDis=3;
PreDis=train.displacement;
}
break;
default:
break;
}
return(OutRevDis);
}
void Show_Io(int id,int tms)
{
static unsigned int shtimer[14],shdelay[14];
static unsigned char preout[2]={0,0};
int i,j;
i=id>>4;
j=id&0x0f;
if(i==0 || i==1)
{
if(j<7)
{
preout[i]|=(unsigned char)(1<<j);
shtimer[i*7+j]=timer;
shdelay[i*7+j]=tms;
}
else
{
preout[i]&=0x7f;
preout[i]|=0x80&(tms<<7);
}
outportb(BASEIO+i,preout[i]);
}
else
{
for(i=0;i<14;i++)
{
if(GetPass(shtimer[i],timer)>=shdelay[i])
{
j=i/7;
preout[j]&=~((unsigned char)1<<(i%7));
outportb(BASEIO+j,preout[j]);
}
}
}
}
void DebugData(int cmd,int id,int len,unsigned char *data)
{
static unsigned char CurDebug=0;
switch(cmd)
{
case 0:
case -1:
case -2:
case -3:
case -4:
case -5:
CurDebug=-cmd;
break;
default:
if(CurDebug==cmd)
{
if(id)
port_puts("Send:",5,com2);
else
port_puts("Receive:",8,com2);
port_puts(data,len,com2);
Show_Io(0x11,30);
}
break;
}
}
void CheckDistance(int id,int dis)
{
static int origindis=0;
int i;
switch(id)
{
case 1:
if(!dis)
return;
//printf("Distance from origin is %d!\n",dis);
if(displacementdrct==2)
i=train.displacement-dis;
else
i=train.displacement+dis;
if(!i)
origindis=1;
else
origindis=i;
break;
case 2:
if(!origindis)
return;
if(train.netstate==1 || train.netstate==2)
{
//displacementdrct上行时位移在增加还是在减少?0=未知,1=增加,2=减少
if(!displacementdrct)
{
if((abs(origindis-train.displacement))>800)
train.netstate=train.netstate*3-3;
}
else if(displacementdrct==1)
{
if((origindis-train.displacement)>800)
train.netstate=train.netstate*3-3;
}
else if(displacementdrct==2)
{
if((train.displacement-origindis)>800)
train.netstate=train.netstate*3-3;
}
if(3==train.netstate)
SaveState(3);
}
break;
default:
break;
}
}
void CreatePlan(void)
{
int i;
unsigned char mth[5]={'1','2','3','4',0};
//unsigned char roads[12]={35,37,39,41,43,45,49,30,28,29,31};
char* roads[12]={"到1","到2","到3","到5","到6","到7","编8","编9","编10","货1","货2","货3"};
char* remarks[10]={"单机西头","注意安全","21018编成","加强联系","控制速度","穿越正线","等","单机东头","减全",""};
joblist.jobid=1;
strcpy(joblist.checi,"1753");
strcpy(joblist.maker,"1234");
joblist.start[4]=12;
joblist.start[5]=10;//strcpy(joblist.start,"12:10");
joblist.end[4]=13;
joblist.end[5]=45;//strcpy(joblist.end,"13:45");
joblist.mode=0x31;
joblist.hooknum=10;
joblist.banhao=1;
for(i=0;i<10;i++)
{
joblist.hooks[i].id=i+1;
strcpy(joblist.hooks[i].area,"W ");
strcpy(joblist.hooks[i].road,roads[i]);
joblist.hooks[i].method=mth[i%5];
joblist.hooks[i].trainnum=i+1;
strcpy(joblist.hooks[i].remark,remarks[i]);
joblist.hooks[i].limit=40;
joblist.hooks[i].pipe=i%5;
}
joblist.hooks[9].trainnum=0xff;
i=random(10)+1;
joblist.curhook=i;
train.curhook=i;
}
int GetTrkLimit(int tid)
{
if(tid)
return(SPDLIMIT);
else
return(SPDLIMIT);
}
int IsOutSignal(int sid)
{
if(sid)
return(0);
else
return(0);
}
int IsSignalSlide(int id)
{
int i;
if(id>0)
{
return(0);
}
else
{
return(0);
}
}
int IsSignalOpen(int id)
{
int i,j;
if(2==train.netstate)
{
if(id==train.forlight || id==train.revlight)
{
if(!id)
return(0);
else if(DRCTXX==GetLightDrct(id))
return((train.signalstate>>1)&0x01);
else
return((train.signalstate>>5)&0x01);
}
}
if(GetSigProp(id)&PROPERTY_XN)
return(0);
i=GetSigLoc(id);
if(i<0)
return(0);
if(id&1)
{
if(id>(station.dhdcnum*2+1))
{
j=(station.signals[i/8]>>(i%8))&0x0f;
if(j==1 || j==2)
return(1);
else
return(0);
}
}
else
{
if(id>(station.shdcnum*2+2))
{
j=(station.signals[i/8]>>(i%8))&0x0f;
if(j==1 || j==2)
return(1);
else
return(0);
}
}
return(GetBit(station.signals[i/8],i%8,0));
}
int GetForLight(int *forlt,int *revlt)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -