📄 station.c
字号:
#include "Station.h"
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <string.h>
#include "mem.h"
#include "djk.h"
#include "namedef.h"
#include "rs232.h"
#include "datadef.h"
//#define GET_FROM_NVRAM
//#define FLASH_SEG 0xc800
//#define FLASH_OFF 0x0000
//#define FLASH_PORT 0x308
#define LINK_DRCT_UP 1
#define LINK_DRCT_DOWN 2
typedef struct {
char flags[4];
unsigned int station;
unsigned char yard;
unsigned char headlen;
unsigned int upstart;
unsigned int upnum;
unsigned int uppoista;
unsigned int uplocsta;
unsigned int downstart;
unsigned int downnum;
unsigned int downpoista;
unsigned int downlocsta;
unsigned char headchk;
unsigned int rtlocs[2];
}TYPE_BRT_HEAD;
typedef struct {
char flags[4];
unsigned int station;
unsigned char yard;
unsigned char headlen;
unsigned char upmax;
unsigned char downmax;
unsigned char datalen;
unsigned int start;
unsigned int num;
unsigned int loc;
unsigned int brtend;
}TYPE_MRT_HEAD;
typedef struct {
unsigned int id;
unsigned char datalen;
unsigned char tracknum;
unsigned int start;
unsigned int end;
unsigned int length;
unsigned int trackdatas[2];
}TYPE_BRT;
typedef struct {
unsigned int brt;
unsigned int mrt;
}TYPE_MRT;
typedef struct {
char flags[4];
unsigned int station;
unsigned char yard;
unsigned char headlen;
unsigned int sglen;
unsigned int sgnum;
unsigned int sgstart;
unsigned int wclen;
unsigned int wcnum;
unsigned int wcstart;
unsigned int gdlen;
unsigned int gdnum;
unsigned int gdstart;
unsigned int swlen;
unsigned int swnum;
unsigned int swstart;
unsigned int xnlen;
unsigned int xnnum;
unsigned int xnstart;
}TYPE_LKFILEHEAD;
typedef struct {
unsigned int id;
unsigned char type;
unsigned int devid;
unsigned int up;
unsigned int down;
unsigned char direction;
unsigned char character;
unsigned char limit;
unsigned int map;
}TYPE_LKFILESG;
typedef struct {
unsigned int id;
unsigned char type;
unsigned int devid;
unsigned int up;
unsigned int down;
unsigned char character;
unsigned int length;
unsigned int map;
}TYPE_LKFILEWC;
typedef struct {
unsigned int id;
unsigned char type;
unsigned int devid;
unsigned int up;
unsigned int down;
unsigned char character;
unsigned int length;
unsigned int map;
}TYPE_LKFILEGD;
typedef struct {
unsigned int id;
unsigned char type;
unsigned int swid;
unsigned int devid;
unsigned int upd;
unsigned int upf;
unsigned int downd;
unsigned int downf;
unsigned char direction;
unsigned char character;
unsigned char relation;
unsigned char swchr;
unsigned char dlimit;
unsigned char flimit;
unsigned int swmap;
unsigned int map;
}TYPE_LKFILESW;
typedef struct {
unsigned int id;
unsigned char type;
unsigned int devid;
unsigned int up;
unsigned int down;
unsigned char direction;
unsigned char character;
unsigned char limit;
unsigned int map;
}TYPE_LKFILEXN;
typedef struct {
unsigned char type;
unsigned int devid;
unsigned int upd;
unsigned int upf;
unsigned int downd;
unsigned int downf;
unsigned char direction;
unsigned char character;
unsigned int map;
unsigned int swmap;
unsigned int length;
}TYPE_LINKNODE;
typedef struct {
unsigned int sgnum;
unsigned int sgstart;
unsigned int wcnum;
unsigned int wcstart;
unsigned int gdnum;
unsigned int gdstart;
unsigned int swnum;
unsigned int swstart;
unsigned int xnnum;
unsigned int xnstart;
unsigned int nodenum;
}TYPE_LINKHEAD;
typedef struct {
int track;
char *tstr;
}TYPE_JOB_MEM;
typedef struct {
int trannum;
TYPE_JOB_MEM *mems;
}TYPE_JOB_TRANSLATE;
static TYPE_BRT_HEAD *pbrthead;
static unsigned char *pbrts;
static TYPE_MRT_HEAD *pmrthead;
static TYPE_MRT *pmrts;
static TYPE_LINKHEAD *plnkhead;
static TYPE_LINKNODE *plnks;
static TYPE_JOB_TRANSLATE jobtr;
extern void G93_ShowInfor(int id,unsigned char cmd);
extern void GetDistance(void);
extern int IsSignalOpen(int id);
extern void GetRtColor(unsigned char engageid);
extern void ClearAllWhite(void);
extern unsigned char GetBit(unsigned char data,int src,int dst);
static unsigned char slide;
extern PORT *com2;
STATION station;
JOBLIST joblist;
ROUTE route1;
ROUTE routepre;
TRAIN train;
#ifdef HAVEDAOCHA
DCLIMIT dclimit;
DCLIMIT savedl;
#endif
/*typedef struct{
unsigned int id;
unsigned int length;
unsigned char start;
unsigned char end;
unsigned char tracknum;
unsigned char tracks[8];
unsigned int tracklen[8];
}BASEROUTE;
typedef struct{
unsigned int id;
unsigned int length;
unsigned char start;
unsigned char end;
unsigned char state;
unsigned char basenum;
BASEROUTE base[7];
}ROUTE;*/
int GetSigLnkLoc(int id)
{
int i,j;
int ret;
ret=-1;
if(id<=0)
return(ret);
if(id&1)
{
j=station.dhdcnum+station.dhlcnum;
if(id<=(j*2-1))
{
ret=(id-1)/2;
}
else if(id<=(2*(j+station.dhxnnum)-1))
{
ret=plnkhead->sgnum+plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum+(id-j*2-1)/2;
}
else
return(ret);
}
else
{
j=station.shdcnum+station.shlcnum;
if(id<=(j*2))
{
ret=station.dhdcnum+station.dhlcnum+(id-2)/2;
}
else if(id<=(2*(j+station.shxnnum)))
{
i=plnkhead->sgnum+plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum+station.dhxnnum;
ret=i+(id-j*2-2)/2;
}
else
return(ret);
}
return(ret);
}
int GetTrkLnkLoc(int id)
{
int i,j;
if(id<=0)
return(-1);
j=plnkhead->sgnum+plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum;
for(i=plnkhead->sgnum;i<j;i++)
{
if(plnks[i].devid==id)
return(i);
}
return(-1);
}
void InitJlData(void)
{
int i,j,floc;
int handle,fllen;
FILE *fl;
handle=open(station.jbjlfile,O_RDONLY);
if(handle==-1)
fllen=0;
else
{
fllen=filelength(handle);
close(handle);
}
if((fl=fopen(station.jbjlfile,"rb"))==NULL) return;
if(pbrts!=NULL)
{
free(pbrts);
pbrts=NULL;
}
pbrts=malloc(fllen);
fread(pbrts,1,fllen,fl);
fclose(fl);
pbrthead=(TYPE_BRT_HEAD*) pbrts;
printf("downstart=%d,downnum=%d\n",pbrthead->downstart,pbrthead->downnum);
if((fl=fopen(station.fhjlfile,"rb"))==NULL) return;
if(pmrthead!=NULL)
{
free(pmrthead);
pmrthead=NULL;
}
if(pmrts!=NULL)
{
free(pmrts);
pmrts=NULL;
}
pmrthead=(TYPE_MRT_HEAD*)malloc(sizeof(TYPE_MRT_HEAD));
if(pmrthead==NULL)
return;
fread(pmrthead,sizeof(TYPE_MRT_HEAD),1,fl);
pmrthead->brtend=pbrthead->downstart+pbrthead->downnum-1;
pmrthead->num=0;
floc=13;
for(i=0;i<(pmrthead->upmax-1);i++)
{
fseek(fl,floc,SEEK_SET);
fread(&j,2,1,fl);
pmrthead->num+=j;
floc+=6;
}
for(i=0;i<(pmrthead->downmax-1);i++)
{
fseek(fl,floc,SEEK_SET);
fread(&j,2,1,fl);
pmrthead->num+=j;
floc+=6;
}
printf("num=%d,loc=%d,brtend=%d\n",pmrthead->num,pmrthead->loc,pmrthead->brtend);
pmrts=(TYPE_MRT*)malloc(sizeof(TYPE_MRT)*pmrthead->num);
fseek(fl,pmrthead->loc,SEEK_SET);
fread(pmrts,sizeof(TYPE_MRT),pmrthead->num,fl);
fclose(fl);
printf("brt1=%d,mrt1=%d,brtn=%d,mrtn=%d\n",pmrts[0].brt,pmrts[0].mrt,
pmrts[pmrthead->num-1].brt,pmrts[pmrthead->num-1].mrt);
}
void InitJobTranslate(void)
{
int i;
char sname[500];
long lvalue;
FILE *fl;
if(jobtr.mems!=NULL)
{
for(i=0;i<jobtr.trannum;i++)
{
if(jobtr.mems[i].tstr!=NULL)
free(jobtr.mems[i].tstr);
}
free(jobtr.mems);
jobtr.mems=NULL;
jobtr.trannum=0;
}
if((fl=fopen(station.jobfile,"r"))!=NULL)
{
lvalue=0;
fscanf(fl,"station=%ld\n",&lvalue);
fscanf(fl,"yard=%ld\n",&lvalue);
fscanf(fl,"translate=%ld\n",&lvalue);
if(lvalue<0)
lvalue=0;
if(lvalue>100)
lvalue=100;
jobtr.trannum=lvalue;
jobtr.mems=malloc(jobtr.trannum*sizeof(TYPE_JOB_MEM));
for(i=0;i<jobtr.trannum;i++)
{
fscanf(fl,"%ld=%s\n",&lvalue,sname);
sname[99]=0;
jobtr.mems[i].track=lvalue;
lvalue=strlen(sname);
jobtr.mems[i].tstr=malloc(lvalue+1);
strcpy(jobtr.mems[i].tstr,sname);
}
fclose(fl);
}
printf("jobtr.trannum=%d\n",jobtr.trannum);
//for(i=0;i<jobtr.trannum;i++)
//{
// printf("%d=%s,%x,%x\n",jobtr.mems[i].track,jobtr.mems[i].tstr,jobtr.mems[i].tstr[0],jobtr.mems[i].tstr[1]);
//}
}
int GetStaInf(long stid)
{
int stanum;
int i,j,nodeid;
long lvalue;
unsigned int lsst;
unsigned int offset,location;
char strs[15];
char lsstrs[50];
FILE *fl;
TYPE_LKFILEHEAD lkhead;
TYPE_LKFILESG *psg=NULL;
TYPE_LKFILEWC *pwc=NULL;
TYPE_LKFILEGD *pgd=NULL;
TYPE_LKFILESW *psw=NULL;
TYPE_LKFILEXN *pxn=NULL;
sprintf(strs,"%ld",stid);
strcpy(lsstrs,strs);
strcat(lsstrs,"dev.djk");
if((fl=fopen(lsstrs,"rb"))==NULL) return(0);
station.stationno=stid;
strcpy(station.devicefile,strs);
strcat(station.devicefile,"dev.djk");
strcpy(station.specfile,strs);
strcat(station.specfile,"spe.djk");
strcpy(station.linkfile,strs);
strcat(station.linkfile,"lnk.djk");
strcpy(station.jbjlfile,strs);
strcat(station.jbjlfile,"bas.djk");
strcpy(station.fhjlfile,strs);
strcat(station.fhjlfile,"mul.djk");
strcpy(station.limitfile,strs);
strcat(station.limitfile,"lim.djk");
strcpy(station.jobfile,strs);
strcat(station.jobfile,"job.djk");
fseek(fl,6,SEEK_SET);
fread(&station.yardno,1,1,fl);
fread(&station.radiochannel,1,1,fl);
printf("yardno=%d,radio=%d\n",station.yardno,station.radiochannel);
fseek(fl,10,SEEK_SET);
fread(&station.dhdcnum,2,10,fl);
fclose(fl);
printf("shgdnum=%d\n",station.shgdnum);
i=(station.dhdcnum+3)/4;
i+=(station.shdcnum+3)/4;
i+=(station.dhlcnum+1)/2;
i+=(station.shlcnum+1)/2;
i+=(station.dhgdnum+3)/4;
i+=(station.shgdnum+3)/4;
i+=(station.dhswnum+3)/4;
i+=(station.shswnum+3)/4;
//i+=(station.dhgdnum+7)/8;
//i+=(station.shgdnum+7)/8;
station.radiodatanum=i;
printf("radiodatanum=%d\n",station.radiodatanum);
station.signalnum=station.dhdcnum+station.shdcnum+station.dhxnnum+station.shxnnum;
printf("signalnum=%d\n",station.signalnum);
if(plnks!=NULL)
free(plnks);
plnks=NULL;
if(plnkhead==NULL)
plnkhead=(TYPE_LINKHEAD*)malloc(sizeof(TYPE_LINKHEAD));
if((fl=fopen(station.linkfile,"rb"))==NULL) return(0);
fread(&lkhead,sizeof(TYPE_LKFILEHEAD),1,fl);
plnkhead->sgnum=lkhead.sgnum;
plnkhead->sgstart=0;
plnkhead->wcnum=lkhead.wcnum;
plnkhead->wcstart=plnkhead->sgstart+plnkhead->sgnum;
plnkhead->gdnum=lkhead.gdnum;
plnkhead->gdstart=plnkhead->wcstart+plnkhead->wcnum;
plnkhead->swnum=lkhead.swnum;
plnkhead->swstart=plnkhead->gdstart+plnkhead->gdnum;
plnkhead->xnnum=lkhead.xnnum;
plnkhead->xnstart=plnkhead->swstart+plnkhead->swnum;
plnkhead->nodenum=lkhead.sgnum+lkhead.wcnum+lkhead.gdnum+lkhead.swnum+lkhead.xnnum;
plnks=(TYPE_LINKNODE*)malloc(sizeof(TYPE_LINKNODE)*plnkhead->nodenum);
nodeid=0;
psg=(TYPE_LKFILESG*)malloc(lkhead.sglen);
fseek(fl,lkhead.sgstart,SEEK_SET);
for(i=0;i<lkhead.sgnum;i++)
{
fread(psg,lkhead.sglen,1,fl);
plnks[nodeid].type=psg->type;
plnks[nodeid].devid=psg->devid;
plnks[nodeid].upd=psg->up;
plnks[nodeid].upf=psg->up;
plnks[nodeid].downd=psg->down;
plnks[nodeid].downf=psg->down;
plnks[nodeid].direction=psg->direction;
plnks[nodeid].character=psg->character;
plnks[nodeid].map=psg->map;
plnks[nodeid].swmap=0;
plnks[nodeid].length=0;
nodeid++;
}
free(psg);
pwc=(TYPE_LKFILEWC*)malloc(lkhead.wclen);
//fseek(fl,lkhead.wcstart,SEEK_SET);
for(i=0;i<lkhead.wcnum;i++)
{
fread(pwc,lkhead.wclen,1,fl);
plnks[nodeid].type=pwc->type;
plnks[nodeid].devid=pwc->devid;
plnks[nodeid].upd=pwc->up;
plnks[nodeid].upf=pwc->up;
plnks[nodeid].downd=pwc->down;
plnks[nodeid].downf=pwc->down;
plnks[nodeid].direction=0;
plnks[nodeid].character=pwc->character;
plnks[nodeid].map=pwc->map;
plnks[nodeid].swmap=0;
plnks[nodeid].length=pwc->length;
nodeid++;
}
free(pwc);
pgd=(TYPE_LKFILEGD*)malloc(lkhead.gdlen);
//fseek(fl,lkhead.gdstart,SEEK_SET);
for(i=0;i<lkhead.gdnum;i++)
{
fread(pgd,lkhead.gdlen,1,fl);
plnks[nodeid].type=pgd->type;
plnks[nodeid].devid=pgd->devid;
plnks[nodeid].upd=pgd->up;
plnks[nodeid].upf=pgd->up;
plnks[nodeid].downd=pgd->down;
plnks[nodeid].downf=pgd->down;
plnks[nodeid].direction=0;
plnks[nodeid].character=pgd->character;
plnks[nodeid].map=pgd->map;
plnks[nodeid].swmap=0;
plnks[nodeid].length=pgd->length;
nodeid++;
}
free(pgd);
psw=(TYPE_LKFILESW*)malloc(lkhead.swlen);
//fseek(fl,lkhead.gdstart,SEEK_SET);
for(i=0;i<lkhead.swnum;i++)
{
fread(psw,lkhead.swlen,1,fl);
plnks[nodeid].type=psw->type;
plnks[nodeid].devid=psw->devid;
plnks[nodeid].upd=psw->upd;
plnks[nodeid].upf=psw->upf;
plnks[nodeid].downd=psw->downd;
plnks[nodeid].downf=psw->downf;
plnks[nodeid].direction=psw->direction;
plnks[nodeid].character=psw->character;
plnks[nodeid].map=psw->map;
plnks[nodeid].swmap=psw->swmap;
plnks[nodeid].length=0;
nodeid++;
}
free(psw);
pxn=(TYPE_LKFILEXN*)malloc(lkhead.xnlen);
//fseek(fl,lkhead.xnstart,SEEK_SET);
for(i=0;i<lkhead.xnnum;i++)
{
fread(pxn,lkhead.xnlen,1,fl);
plnks[nodeid].type=pxn->type;
plnks[nodeid].devid=pxn->devid;
plnks[nodeid].upd=pxn->up;
plnks[nodeid].upf=pxn->up;
plnks[nodeid].downd=pxn->down;
plnks[nodeid].downf=pxn->down;
plnks[nodeid].direction=pxn->direction;
plnks[nodeid].character=pxn->character;
plnks[nodeid].map=pxn->map;
plnks[nodeid].swmap=0;
plnks[nodeid].length=0;
nodeid++;
}
free(pxn);
fclose(fl);
printf("sgnum=%d,gdnum=%d,swnum=%d,xnnum=%d\n",plnkhead->sgnum,plnkhead->gdnum,
plnkhead->swnum,plnkhead->xnnum);
nodeid-=2;
printf("type=%d,devid=%d,upd=%d,upf=%d,downd=%d,downf=%d,direction=%d,character=%d,map=%d\n",
plnks[nodeid].type,plnks[nodeid].devid,plnks[nodeid].upd,plnks[nodeid].upf,
plnks[nodeid].downd,plnks[nodeid].downf,plnks[nodeid].direction,
plnks[nodeid].character,plnks[nodeid].map);
nodeid=0;
printf("type=%d,devid=%d,upd=%d,upf=%d,downd=%d,downf=%d,direction=%d,character=%d,map=%d\n",
plnks[nodeid].type,plnks[nodeid].devid,plnks[nodeid].upd,plnks[nodeid].upf,
plnks[nodeid].downd,plnks[nodeid].downf,plnks[nodeid].direction,
plnks[nodeid].character,plnks[nodeid].map);
if(station.entrances!=NULL)
free(station.entrances);
station.entrances=NULL;
if((fl=fopen(station.specfile,"rb"))!=NULL)
{
fseek(fl,9,SEEK_SET);
fread(&station.entrancenum,1,1,fl);
fread(&i,2,1,fl);
i+=4;
printf("entancenum=%d\n",station.entrancenum);
fseek(fl,i,SEEK_SET);
station.entrances=(TYPE_ENTRANCE *)malloc(sizeof(TYPE_ENTRANCE)*station.entrancenum);
fread(station.entrances,sizeof(TYPE_ENTRANCE),station.entrancenum,fl);
fclose(fl);
printf("id \tfac\tsor\ttra\tups\tdos\tupd\tdod\tupa\tdoa\n");
for(i=0;i<station.entrancenum;i++)
{
printf("%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\n",(int)station.entrances[i].id,
(int)station.entrances[i].factory,(int)station.entrances[i].sort,
station.entrances[i].track,
station.entrances[i].upsignal,station.entrances[i].downsignal,
station.entrances[i].updistance,station.entrances[i].downdistance,
station.entrances[i].upaction,station.entrances[i].downaction);
}
//printf("en1=%d,end9=%d\n",station.entrances[0].id,station.entrances[8].id);
}
else
station.entrancenum=0;
i=(station.dhgdnum+1)/2+(station.shgdnum+1)/2;
if(station.showtra!=NULL)
free(station.showtra);
station.showtra=NULL;
station.showtra=(unsigned char *)malloc(i);
if(station.signals!=NULL)
free(station.signals);
station.signals=NULL;
station.signals=(unsigned char *)malloc(station.radiodatanum);
i=(station.dhdcnum+3)/4;
i+=(station.shdcnum+3)/4;
i+=(station.dhlcnum+1)/2;
i+=(station.shlcnum+1)/2;
station.tracks=station.signals+i;
i+=(station.dhgdnum+3)/4;
i+=(station.shgdnum+3)/4;
station.switchs=station.signals+i;
InitJobTranslate();
//i+=(station.dhswnum+3)/4;
//i+=(station.shswnum+3)/4;
//station.lctrks=station.signals+i;
InitJlData();
return(1);
}
int ResetStation(long stid)
{
int i;
disable();
i=GetStaInf(stid);
enable();
if(i)
{
train.netstate=0;
}
return(i);
}
void InitStation(void)
{
int i;
long lvalue;
FILE *fl;
station.stationno=0;
station.yardno=0;
station.dhdcnum=0;
station.shdcnum=0;
station.dhlcnum=0;
station.shlcnum=0;
station.dhxnnum=0;
station.shxnnum=0;
station.dhgdnum=0;
station.shgdnum=0;
station.dhswnum=0;
station.shswnum=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -