szczanieckiej.git

commit 8f1377fe30de0c4d0e068f15c01f2fa19955ce32

Author: Adam <git@apiote.xyz>

remove StopOrder.TripID

 traffic/access.go | 7 +++----
 traffic/convert.go | 25 +++++++++++++++----------
 traffic/structs_gen.go | 43 ++++++++++++++++++++++++++++++++++++++++---


diff --git a/traffic/access.go b/traffic/access.go
index 7d8ad43e666814fc12d2cbadea67e40bf254711d..034ff87e56263292d2a998d73d37b7c060121b22 100644
--- a/traffic/access.go
+++ b/traffic/access.go
@@ -271,7 +271,6 @@ 		_, inToday := result.TodaySchedule[trip.ScheduleID]
 		_, inYesterday := result.YesterdaySchedule[trip.ScheduleID]
 		if inToday || inYesterday {
 			trips[trip.Id] = trip
-			order.TripID = trip.Id
 			orders[trip.Id] = order
 		}
 	}
@@ -284,8 +283,8 @@ func getUpdates(input ...interface{}) (interface{}, error) {
 	result := input[0].(_Result)
 	departures := []DepartureRealtime{}
 	timedOut := false
-	for _, order := range result.Stop.Order {
-		trip := result.Trips[order.TripID]
+	for tripID, order := range result.Stop.Order {
+		trip := result.Trips[tripID]
 
 		var date time.Time
 		if _, ok := result.TodaySchedule[trip.ScheduleID]; ok {
@@ -335,7 +334,7 @@ 			departureRt.Update.Time = departureTime
 
 			if departureTime.After(result.Midnight) {
 				if result.DeparturesType == DEPARTURES_HYBRID && !timedOut {
-					departureRt.Update, err = getRealtimeOffset(order.TripID,
+					departureRt.Update, err = getRealtimeOffset(trip.Id,
 						order.Sequence, feed)
 					if err != nil {
 						if isTimeout(err) {




diff --git a/traffic/convert.go b/traffic/convert.go
index f9dc74a1f211e05258595bdc80287de0db83d793..a2d2e55a70394e2b2aec6eb0200d104c70b23829 100644
--- a/traffic/convert.go
+++ b/traffic/convert.go
@@ -2,6 +2,10 @@ package traffic
 
 // todo(BAF10) direction (0|1) to const (TO|BACK)
 // fixme converting lines takes much time (graphs)
+// todo Agency.language, FeedInfo.language -> IETF language tag
+// todo Agency.phoneNumber -> E.123 format
+// todo remove StopOrder.tripID
+// todo validity to FeedInfo, not filename
 
 import (
 	"apiote.xyz/p/szczanieckiej/config"
@@ -11,7 +15,6 @@ 	"bufio"
 	"encoding/csv"
 	"errors"
 	"fmt"
-	//"image/color"
 	"io"
 	"io/fs"
 	"log"
@@ -61,7 +64,7 @@ 	HomeFeedPath string
 
 	TrafficCalendarFile *os.File
 	Departures          map[string][]Departure
-	TripsThroughStop    map[string][]StopOrder
+	TripsThroughStop    map[string]map[string]StopOrder
 	LineNames           map[string]string
 	TripsOffsets        map[string]uint
 	TripChangeOpts      map[string]ChangeOption
@@ -462,7 +465,7 @@ 	for i, headerField := range header {
 		fields[headerField] = i
 	}
 
-	tripsThroughStop := map[string][]StopOrder{}
+	tripsThroughStop := map[string]map[string]StopOrder{}
 	tripHeadsigns := map[string]string{}
 
 	for {
@@ -482,10 +485,12 @@ 		fmt.Sscanf(record[fields["stop_sequence"]], "%d", &departure.StopSequence)
 		fmt.Sscanf(record[fields["pickup_type"]], "%d", &departure.Pickup)
 		fmt.Sscanf(record[fields["drop_off_type"]], "%d", &departure.Dropoff)
 
-		tripsThroughStop[stopID] = append(tripsThroughStop[stopID], StopOrder{
-			TripID:   tripID,
+		if _, ok := tripsThroughStop[stopID]; !ok {
+			tripsThroughStop[stopID] = map[string]StopOrder{}
+		}
+		tripsThroughStop[stopID][tripID] = StopOrder{
 			Sequence: departure.StopSequence,
-		})
+		}
 
 		if c.Feed.Flags().Headsign == HeadsignTripLastStop {
 			tripHeadsigns[tripID] = stopID
@@ -749,13 +754,13 @@
 		changeOptionMap := map[string]ChangeOption{}
 		stop.ChangeOptions = []ChangeOption{}
 		stop.Order = map[string]StopOrder{}
-		for _, stopTrip := range stopTrips {
-			changeOption := tripChangeOpts[stopTrip.TripID]
+		for tripID, stopTrip := range stopTrips {
+			changeOption := tripChangeOpts[tripID]
 			stopOrder := StopOrder{
-				TripOffset: tripsOffsets[stopTrip.TripID],
+				TripOffset: tripsOffsets[tripID],
 				Sequence:   stopTrip.Sequence,
 			}
-			stop.Order[stopTrip.TripID] = stopOrder
+			stop.Order[tripID] = stopOrder
 			changeOptionMap[changeOption.LineName+"->"+changeOption.Headsign] = changeOption
 		}
 		for _, option := range changeOptionMap {




diff --git a/traffic/structs_gen.go b/traffic/structs_gen.go
index fb8859898c4991e4c4fc50ce4f4cb0bb5a13738f..0f5522ba86e072f5146e242ea352b3faee51bf43 100644
--- a/traffic/structs_gen.go
+++ b/traffic/structs_gen.go
@@ -115,9 +115,8 @@ 	return bare.Marshal(t)
 }
 
 type StopOrder struct {
-	TripOffset uint   `bare:"tripOffset"`
-	Sequence   int    `bare:"sequence"`
-	TripID     string `bare:"tripID"`
+	TripOffset uint `bare:"tripOffset"`
+	Sequence   int  `bare:"sequence"`
 }
 
 func (t *StopOrder) Decode(data []byte) error {
@@ -249,6 +248,44 @@ 	case BACK:
 		return "BACK"
 	}
 	panic(errors.New("Invalid Direction value"))
+}
+
+type VehicleCapabilities uint
+
+const (
+	RAMP                VehicleCapabilities = 1
+	LOW_FLOOR           VehicleCapabilities = 2
+	AIR_CONDITIONING    VehicleCapabilities = 4
+	BICYCLE             VehicleCapabilities = 8
+	VOICE_ANNOUNCEMENTS VehicleCapabilities = 16
+	TICKET_MACHINE      VehicleCapabilities = 32
+	TICKET_SOLD_DRIVER  VehicleCapabilities = 64
+	USB_CHARGING        VehicleCapabilities = 128
+	LOW_FLOOR_PARTIAL   VehicleCapabilities = 256
+)
+
+func (t VehicleCapabilities) String() string {
+	switch t {
+	case RAMP:
+		return "RAMP"
+	case LOW_FLOOR:
+		return "LOW_FLOOR"
+	case AIR_CONDITIONING:
+		return "AIR_CONDITIONING"
+	case BICYCLE:
+		return "BICYCLE"
+	case VOICE_ANNOUNCEMENTS:
+		return "VOICE_ANNOUNCEMENTS"
+	case TICKET_MACHINE:
+		return "TICKET_MACHINE"
+	case TICKET_SOLD_DRIVER:
+		return "TICKET_SOLD_DRIVER"
+	case USB_CHARGING:
+		return "USB_CHARGING"
+	case LOW_FLOOR_PARTIAL:
+		return "LOW_FLOOR_PARTIAL"
+	}
+	panic(errors.New("Invalid VehicleCapabilities value"))
 }
 
 type Boarding uint