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

📄 djk.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -