reverse routing is working now

origin
steffen 5 years ago
parent c2493ab90e
commit 9c633da3ec

@ -303,6 +303,20 @@ void Blocks::ClearLockedby(string name) {
}; };
int Blocks::GetFlags (string blname) {
int res = 0;
int i;
JSONParse jp;
Lock();
for (i = 0; i < max; i++) if (blname.compare(blocks[i].name) == 0) {
res = blocks[i].flags;
}
UnLock();
return res;
};
string Blocks::GetSensorMinus (string blname) { string Blocks::GetSensorMinus (string blname) {
string res = ""; string res = "";
int i; int i;

@ -58,6 +58,7 @@ class Blocks {
string GetSensorMinus (string blname); string GetSensorMinus (string blname);
string GetSensorCenter (string blname); string GetSensorCenter (string blname);
string GetSensorPlus (string blname); string GetSensorPlus (string blname);
int GetFlags (string blname);
int SetLockedby (string blname, string lockedby, int lock_onoff); int SetLockedby (string blname, string lockedby, int lock_onoff);
string GetLockedby (string blname); string GetLockedby (string blname);

@ -559,7 +559,6 @@ int Locomotives::AutoCheckWaySingleStep(string way, string locname, int *data) {
} }
int Locomotives::Loop() { int Locomotives::Loop() {
int lnum, i; int lnum, i;
string way; string way;
@ -567,9 +566,13 @@ int Locomotives::Loop() {
string block; string block;
string sensor; string sensor;
JSONParse jp; JSONParse jp;
int reverse = 1;
for (lnum = 0; lnum < max; lnum++) if (locomotives[lnum].name[0] != 0) { for (lnum = 0; lnum < max; lnum++) if (locomotives[lnum].name[0] != 0) {
loco = &locomotives[lnum]; loco = &locomotives[lnum];
if (loco->flags & LOCO_F_REVERSE) reverse = -1;
else reverse = 1;
if (loco->flags & LOCO_F_AUTO) { if (loco->flags & LOCO_F_AUTO) {
// //
// only in automate do anything alone // only in automate do anything alone
@ -582,6 +585,9 @@ int Locomotives::Loop() {
} }
else if (loco->auto_onroute == LOCO_OR_SEARCH) { else if (loco->auto_onroute == LOCO_OR_SEARCH) {
//
// find way, if nothing found check if we can reverse direction
//
if (loco->auto_timenext.tv_sec == 0 || timer_get(&loco->auto_timenext) > LOCO_TO_TRYAGAIN) { if (loco->auto_timenext.tv_sec == 0 || timer_get(&loco->auto_timenext) > LOCO_TO_TRYAGAIN) {
if (server->railways.FindWay(loco->blockassign, loco->blockdest, loco->name, &way)) { if (server->railways.FindWay(loco->blockassign, loco->blockdest, loco->name, &way)) {
size_t pos; size_t pos;
@ -596,15 +602,28 @@ int Locomotives::Loop() {
else timer_start(&loco->auto_timenext); else timer_start(&loco->auto_timenext);
} }
} }
else timer_start(&loco->auto_timenext); else {
if (loco->blockassign[0] != 0 && (loco->flags & LOCO_F_CANREVERSE)) {
if (loco->blockassign[0] == '-') loco->blockassign[0] = '+';
else if (loco->blockassign[0] == '+') loco->blockassign[0] = '-';
if (loco->flags & LOCO_F_REVERSE) loco->flags &= ~LOCO_F_REVERSE;
else loco->flags |= LOCO_F_REVERSE;
}
timer_start(&loco->auto_timenext);
}
} }
} }
else if (loco->auto_onroute == LOCO_OR_PREPARE) { else if (loco->auto_onroute == LOCO_OR_PREPARE) {
block = loco->blocknext+2;
if (loco->auto_timenext.tv_sec == 0 || timer_get(&loco->auto_timenext) > LOCO_TO_TURNOUT) { if (loco->auto_timenext.tv_sec == 0 || timer_get(&loco->auto_timenext) > LOCO_TO_TURNOUT) {
if (AutoCheckWaySingleStep(loco->auto_way, loco->name, &loco->auto_data) == 1) { if (AutoCheckWaySingleStep(loco->auto_way, loco->name, &loco->auto_data) == 1) {
if (loco->flags & LOCO_F_CARGO) SetSpeed(loco->name, loco->vmid); if ((loco->flags & LOCO_F_CARGO) ||
else SetSpeed(loco->name, loco->vfast); (server->blocks.GetFlags(block) & BLOCK_F_SPEEDLIMIT))
SetSpeed(loco->name, reverse * loco->vmid);
else SetSpeed(loco->name, reverse * loco->vfast);
loco->auto_onroute = LOCO_OR_ONTHEWAY; loco->auto_onroute = LOCO_OR_ONTHEWAY;
} }
else timer_start(&loco->auto_timenext); else timer_start(&loco->auto_timenext);
@ -638,7 +657,7 @@ int Locomotives::Loop() {
printf ("%s:%d LOCO_OR_ONTHEWAY enter assign == dest stop\n", __FILE__, __LINE__); printf ("%s:%d LOCO_OR_ONTHEWAY enter assign == dest stop\n", __FILE__, __LINE__);
loco->blockdest[0] = 0; loco->blockdest[0] = 0;
loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP; loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP;
SetSpeed(loco->name, loco->vslow); SetSpeed(loco->name, reverse * loco->vslow);
} }
else { else {
// try to find new way // try to find new way
@ -655,17 +674,17 @@ int Locomotives::Loop() {
} }
else { else {
loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP; loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP;
SetSpeed(loco->name, loco->vslow); SetSpeed(loco->name, reverse * loco->vslow);
} }
} }
else { else {
loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP; loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP;
SetSpeed(loco->name, loco->vslow); SetSpeed(loco->name, reverse * loco->vslow);
} }
} }
else { else {
loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP; loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP;
SetSpeed(loco->name, loco->vslow); SetSpeed(loco->name, reverse * loco->vslow);
} }
} }
@ -676,7 +695,7 @@ int Locomotives::Loop() {
if (loco->auto_onroute == LOCO_OR_ONTHEWAY) { if (loco->auto_onroute == LOCO_OR_ONTHEWAY) {
loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP; loco->auto_onroute = LOCO_OR_ENTERBLOCKSTOP;
SetSpeed(loco->name, loco->vslow); SetSpeed(loco->name, reverse * loco->vslow);
} }
} }
} }
@ -734,6 +753,10 @@ int Locomotives::Loop() {
timer_start(&loco->auto_timenext); timer_start(&loco->auto_timenext);
} }
else { else {
if (server->blocks.GetFlags(block) & BLOCK_F_SPEEDLIMIT) {
SetSpeed(loco->name, reverse * loco->vmid);
}
loco->auto_onroute = LOCO_OR_ONTHEWAY; loco->auto_onroute = LOCO_OR_ONTHEWAY;
} }
} }

Loading…
Cancel
Save