diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2020-05-27 14:58:13 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2020-05-27 14:58:13 +0200 | 
| commit | 265d6934cd70a60228e7a11cfc000aff73dd4701 (patch) | |
| tree | 610eb753fea70e7f407e751e22697fc8a1ec04bd /app/bin/ctrain.c | |
| parent | bd8c21a35fd05fcbdaa95e4c0b7c94c3b97507b6 (diff) | |
| parent | 359b557176b9bb2ff1aed2082641eed39c358d0d (diff) | |
Update upstream source from tag 'upstream/5.1.2a'
Update to upstream version '5.1.2a'
with Debian dir 4d0d8239e41bb5de5dc968c2a5c6eb9c140bb2f3
Diffstat (limited to 'app/bin/ctrain.c')
| -rw-r--r-- | app/bin/ctrain.c | 55 | 
1 files changed, 41 insertions, 14 deletions
| diff --git a/app/bin/ctrain.c b/app/bin/ctrain.c index d480982..fe41a39 100644 --- a/app/bin/ctrain.c +++ b/app/bin/ctrain.c @@ -183,8 +183,8 @@ static descData_t carDesc[] = {      /*AN*/	{ DESC_ANGLE, N_("Angle"), &carData.angle },      /*LN*/	{ DESC_DIM, N_("Length"), &carData.length },      /*WD*/	{ DESC_DIM, N_("Width"), &carData.width }, -    /*DE*/	{ DESC_STRING, N_("Description"), &carData.desc }, -    /*NM*/	{ DESC_STRING, N_("Rep Marks"), &carData.number }, +    /*DE*/	{ DESC_STRING, N_("Description"), &carData.desc, sizeof(carData.desc)  }, +    /*NM*/	{ DESC_STRING, N_("Rep Marks"), &carData.number, sizeof(carData.number) },      { DESC_NULL }  }; @@ -199,10 +199,14 @@ static void UpdateCar(          const char * cp;          titleChanged = FALSE;          cp = wStringGetValue((wString_p)carDesc[NM].control0); - +        unsigned int max_str = sizeof(carData.number); +		if (max_str && strlen(cp)>max_str) { +			NoticeMessage2(0, MSG_ENTERED_STRING_TRUNCATED, _("Ok"), NULL, max_str-1); +        }          if (cp && strcmp(carData.number, cp) != 0) {              titleChanged = TRUE; -            strcpy(carData.number, cp); +			carData.number[0] = '\0'; +			strncat(carData.number, cp, max_str - 1);          }          if (!titleChanged) { @@ -245,12 +249,18 @@ static void DescribeCar(      carData.length = size.x;      carData.width = size.y;      cp = CarItemDescribe(xx->item, 0, &carData.index); -    strcpy(carData.number, CarItemNumber(xx->item)); -    strncpy(str, cp, len); -    carData.pos = xx->trvTrk.pos; -    carData.angle = xx->trvTrk.angle; -    cp = CarItemDescribe(xx->item, -1, NULL); -    strncpy(carData.desc, cp, sizeof carData.desc); + +	carData.number[0] = '\0'; +	strncat(carData.number, CarItemNumber(xx->item), +		sizeof(carData.number) - 1); +	str[0] = '\0'; +	strncat(str, cp, len - 1); +	carData.pos = xx->trvTrk.pos; +	carData.angle = xx->trvTrk.angle; +	cp = CarItemDescribe(xx->item, -1, NULL); +	carData.desc[0] = '\0'; +	strncat(carData.desc, cp, sizeof(carData.desc) - 1); +      carDesc[IT].mode =          carDesc[PN].mode =              carDesc[AN].mode = @@ -1682,7 +1692,11 @@ static void CrashTrain(      PlaceCar(car);  } - +/* + * Check if this should couple or optionally if it should crash + * It will call couple or crash if needed. + * Returns TRUE if we should continue. + */  static BOOL_T CheckCoupling(      track_p car0,      int dir00, @@ -1734,17 +1748,19 @@ static BOOL_T CheckCoupling(          return TRUE;      } -    /* are we close to aligned? */ +    /* are we close to aligned? Uses 45 degrees offset today */ +    /* It assumes that if the cars are aligned they could/should be coupled */      if (angle > COUPLERCONNECTIONANGLE && angle < 360.0-COUPLERCONNECTIONANGLE) {          return TRUE;      } -    /* find pos of found car's coupler, and dist btw couplers */ +    /* find pos of found end car's coupler, and dist btw couplers */      distc = CarItemCoupledLength(xx1->item); +    /* pos1 is the end of the xx1 car (end car) */      Translate(&pos1, xx1->trvTrk.pos, xx1->trvTrk.angle+(dir1?180.0:0.0),                distc/2.0);      dist = FindDistance(trvTrk0.pos, pos1); - +    /* How far away are the two ends?*/      if (dist < trackGauge/10) {          return TRUE;      } @@ -1769,12 +1785,23 @@ static BOOL_T CheckCoupling(          FlipTraverseTrack(&trvTrk1);      } +    /* Move second train back along track half a car length */      TraverseTrack2(&trvTrk1, distc/2.0-dist); +    /* If tracks are not the same - dont couple */      if (trvTrk1.trk != trvTrk0.trk) {          return TRUE;      } +    /* If this is further apart than 2 track gauges on a turnout, dont couple */ +	if (GetTrkType(trvTrk0.trk) == T_TURNOUT) { +		if (dist > GetTrkGauge(trvTrk0.trk)*2) { +			return TRUE; +		} +	} + +	/* Concluded we are hitting each other */ +      if (doCheckCrash) {          track_p loco1;          long speed, speed0, speed1; | 
