ref: master
app/src/main/java/xyz/apiote/bimba/czwek/repo/Vehicle.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
// SPDX-FileCopyrightText: Adam Evyčędo // // SPDX-License-Identifier: GPL-3.0-or-later package xyz.apiote.bimba.czwek.repo import android.content.Context import xyz.apiote.bimba.czwek.R import xyz.apiote.bimba.czwek.api.CongestionLevelV1 import xyz.apiote.bimba.czwek.api.OccupancyStatusV1 import xyz.apiote.bimba.czwek.api.VehicleV1 import xyz.apiote.bimba.czwek.api.VehicleV2 import xyz.apiote.bimba.czwek.api.VehicleV3 import xyz.apiote.bimba.czwek.units.Mps enum class CongestionLevel { UNKNOWN, SMOOTH, STOP_AND_GO, SIGNIFICANT, SEVERE; fun toString(context: Context): String { return when (this) { UNKNOWN -> context.getString(R.string.congestion_unknown) SMOOTH -> context.getString(R.string.congestion_smooth) STOP_AND_GO -> context.getString(R.string.congestion_stop_and_go) SIGNIFICANT -> context.getString(R.string.congestion_congestion) SEVERE -> context.getString(R.string.congestion_jams) } } companion object { fun of(type: CongestionLevelV1): CongestionLevel { return when (type) { CongestionLevelV1.UNKNOWN -> valueOf("UNKNOWN") CongestionLevelV1.SMOOTH -> valueOf("SMOOTH") CongestionLevelV1.STOP_AND_GO -> valueOf("STOP_AND_GO") CongestionLevelV1.SIGNIFICANT -> valueOf("SIGNIFICANT") CongestionLevelV1.SEVERE -> valueOf("SEVERE") } } } } enum class OccupancyStatus { UNKNOWN, EMPTY, MANY_AVAILABLE, FEW_AVAILABLE, STANDING_ONLY, CRUSHED, FULL, NOT_ACCEPTING; fun toString(context: Context):String { return when (this) { UNKNOWN -> context.getString(R.string.occupancy_unknown) EMPTY -> context.getString(R.string.occupancy_empty) MANY_AVAILABLE -> context.getString(R.string.occupancy_many_seats) FEW_AVAILABLE -> context.getString(R.string.occupancy_few_seats) STANDING_ONLY -> context.getString(R.string.occupancy_standing_only) CRUSHED -> context.getString(R.string.occupancy_crowded) FULL -> context.getString(R.string.occupancy_full) NOT_ACCEPTING -> context.getString(R.string.occupancy_wont_let) } } companion object { fun of(type: OccupancyStatusV1): OccupancyStatus { return when (type) { OccupancyStatusV1.UNKNOWN -> valueOf("UNKNOWN") OccupancyStatusV1.EMPTY -> valueOf("EMPTY") OccupancyStatusV1.MANY_AVAILABLE -> valueOf("MANY_AVAILABLE") OccupancyStatusV1.FEW_AVAILABLE -> valueOf("FEW_AVAILABLE") OccupancyStatusV1.STANDING_ONLY -> valueOf("STANDING_ONLY") OccupancyStatusV1.CRUSHED -> valueOf("CRUSHED") OccupancyStatusV1.FULL -> valueOf("FULL") OccupancyStatusV1.NOT_ACCEPTING -> valueOf("NOT_ACCEPTING") } } } } data class Vehicle( val ID: String, val Position: Position, val Capabilities: UShort, val Speed: Mps, val Line: LineStub, val Headsign: String, val congestionLevel: CongestionLevel, val occupancyStatus: OccupancyStatus ) : Locatable { constructor(v: VehicleV1) : this( v.ID, Position(v.Position), v.Capabilities, Mps(v.Speed.toDouble()), LineStub(v.Line), v.Headsign, CongestionLevel.of(v.CongestionLevel), OccupancyStatus.of(v.OccupancyStatus) ) constructor(v: VehicleV2) : this( v.ID, Position(v.Position), v.Capabilities, Mps(v.Speed.toDouble()), LineStub(v.Line), v.Headsign, CongestionLevel.of(v.CongestionLevel), OccupancyStatus.of(v.OccupancyStatus) ) constructor(v: VehicleV3) : this( v.ID, Position(v.Position), v.Capabilities, Mps(v.Speed.toDouble()), LineStub(v.Line), v.Headsign, CongestionLevel.of(v.CongestionLevel), OccupancyStatus.of(v.OccupancyStatus) ) enum class Capability(val bit: UShort) { RAMP(0b0001u), LOW_FLOOR(0b0010u), LOW_ENTRY(0b0001_0000_0000u), AC(0b0100u), BIKE(0b1000u), VOICE( 0b0001_0000u ), TICKET_MACHINE(0b0010_0000u), TICKET_DRIVER(0b0100_0000u), USB_CHARGING(0b1000_0000u) } override fun icon(context: Context, scale: Float) = Line.icon(context, scale) override fun location(): Position = Position override fun id(): String = ID fun congestion(context: Context) = congestionLevel.toString(context) fun occupancy(context: Context)= occupancyStatus.toString(context) fun getCapability(field: Capability): Boolean { return Capabilities.and(field.bit) != (0).toUShort() } } |