Module: Mqttopia::Serializers::TripMetric

Defined in:
lib/mqttopia/serializers/trip_metric.rb

Constant Summary collapse

KEYS =
i[ts locPerms connS batt battPwOp pws notf gps nlog loc].freeze

Class Method Summary collapse

Class Method Details

.charging_status_mapper(charging_status) ⇒ Object



76
77
78
79
80
81
82
83
# File 'lib/mqttopia/serializers/trip_metric.rb', line 76

def charging_status_mapper(charging_status)
  {
    "0" => "UNKNOWN",
    "1" => "DISCHARGING",
    "2" => "CHARGING",
    "3" => "FULL"
  }.fetch(charging_status&.to_s) { "UNKNOWN" }
end

.current_timestampObject



89
90
91
# File 'lib/mqttopia/serializers/trip_metric.rb', line 89

def current_timestamp
  DateTime.now.strftime("%Q")
end

.location_permission_mapper(permission) ⇒ Object



66
67
68
69
70
71
72
73
74
# File 'lib/mqttopia/serializers/trip_metric.rb', line 66

def location_permission_mapper(permission)
  {
    "0" => "BACKGROUND_FINE",
    "-1" => "BACKGROUND_COARSE",
    "-2" => "FOREGROUND_FINE",
    "-3" => "FOREGROUND_COARSE",
    "-4" => "DISABLED"
  }.fetch(permission&.to_s) { "UNKNOWN" }
end

.serialize(body) ⇒ Object



10
11
12
13
14
15
16
17
18
19
# File 'lib/mqttopia/serializers/trip_metric.rb', line 10

def serialize(body)
  return unless valid_metric?(body[:metrics])

  {
    trip_id: body[:trip_id],
    metrics: serialize_metrics(body[:metrics]),
    logged_at: body.dig(:metrics, :ts)&.to_s,
    received_at: current_timestamp
  }
end

.serialize_battery(battery, optimization_status, power_saving_mode) ⇒ Object



43
44
45
46
47
48
49
50
51
52
# File 'lib/mqttopia/serializers/trip_metric.rb', line 43

def serialize_battery(battery, optimization_status, power_saving_mode)
  return unless battery

  {
    battery_level: battery[:l],
    charging_status: charging_status_mapper(battery[:cs]),
    optimization_status: optimization_status&.zero?,
    power_saving_mode: power_saving_mode&.zero?
  }
end

.serialize_connection(connt_s) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/mqttopia/serializers/trip_metric.rb', line 33

def serialize_connection(connt_s)
  return unless connt_s

  {
    connection_type: connt_s[:type],
    connection_sub_type: connt_s[:subType],
    connection_status: connt_s[:connt]
  }
end

.serialize_location(location) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/mqttopia/serializers/trip_metric.rb', line 54

def serialize_location(location)
  return unless location

  {
    latitude: location[:lat],
    longitude: location[:lon],
    accuracy: location[:acc],
    altitude: location[:alt],
    logged_at: location[:ts]&.to_s
  }
end

.serialize_metrics(metrics) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/mqttopia/serializers/trip_metric.rb', line 21

def serialize_metrics(metrics)
  {
    location_permission: location_permission_mapper(metrics[:locPerms]),
    connection: serialize_connection(metrics[:connS]),
    battery: serialize_battery(metrics[:batt], metrics[:battPwOp], metrics[:pws]),
    notification_permission: metrics[:notf]&.zero?,
    gps: metrics[:gps]&.zero?,
    number_of_trip_logs: metrics[:nlog],
    location: serialize_location(metrics[:loc])
  }
end

.valid_metric?(metrics) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/mqttopia/serializers/trip_metric.rb', line 85

def valid_metric?(metrics)
  metrics.is_a?(Hash) && KEYS.all? { |key| metrics.key?(key) }
end