Bimba.git

ref: fruchtfleisch

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
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

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: Float,
	val Line: LineStub,
	val Headsign: String,
	val congestionLevel: CongestionLevel,
	val occupancyStatus: OccupancyStatus
) : Locatable {
	constructor(v: VehicleV1) : this(
		v.ID,
		Position(v.Position),
		v.Capabilities,
		v.Speed,
		LineStub(v.Line),
		v.Headsign,
		CongestionLevel.of(v.CongestionLevel),
		OccupancyStatus.of(v.OccupancyStatus)
	)

	constructor(v: VehicleV2) : this(
		v.ID,
		Position(v.Position),
		v.Capabilities,
		v.Speed,
		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()
	}
}