mirror of
https://github.com/teslamate-org/teslamate.git
synced 2026-01-24 21:06:08 +08:00
168 lines
5.1 KiB
Elixir
168 lines
5.1 KiB
Elixir
defmodule LogMock do
|
|
use GenServer
|
|
|
|
defstruct [:pid, :last_update]
|
|
alias __MODULE__, as: State
|
|
|
|
alias TeslaMate.Log.{Drive, ChargingProcess, Update, Car, Position}
|
|
alias TeslaMate.Log
|
|
|
|
# API
|
|
|
|
def start_link(opts) do
|
|
GenServer.start_link(__MODULE__, opts, name: Keyword.fetch!(opts, :name))
|
|
end
|
|
|
|
def start_state(name, car, state, opts) do
|
|
GenServer.call(name, {:start_state, car, state, opts})
|
|
end
|
|
|
|
def get_current_state(name, car), do: GenServer.call(name, {:get_current_state, car})
|
|
|
|
def start_drive(name, car), do: GenServer.call(name, {:start_drive, car})
|
|
def close_drive(name, drive, opts \\ []), do: GenServer.call(name, {:close_drive, drive, opts})
|
|
|
|
def start_update(name, car, opts), do: GenServer.call(name, {:start_update, car, opts})
|
|
def cancel_update(name, update), do: GenServer.call(name, {:cancel_update, update})
|
|
|
|
def finish_update(name, update, vsn, opts) do
|
|
GenServer.call(name, {:finish_update, update, vsn, opts})
|
|
end
|
|
|
|
def get_latest_update(name, car) do
|
|
GenServer.call(name, {:get_latest_update, car})
|
|
end
|
|
|
|
def insert_missed_update(name, car, vsn, opts) do
|
|
GenServer.call(name, {:insert_missed_update, car, vsn, opts})
|
|
end
|
|
|
|
def start_charging_process(name, car, position_attrs, opts \\ []) do
|
|
GenServer.call(name, {:start_charging_process, car, position_attrs, opts})
|
|
end
|
|
|
|
def complete_charging_process(name, cproc) do
|
|
GenServer.call(name, {:complete_charging_process, cproc})
|
|
end
|
|
|
|
def insert_position(name, car_or_drive, attrs) do
|
|
GenServer.call(name, {:insert_position, car_or_drive, attrs})
|
|
end
|
|
|
|
def insert_charge(name, cproc, attrs) do
|
|
GenServer.call(name, {:insert_charge, cproc, attrs})
|
|
end
|
|
|
|
def get_positions_without_elevation(name, min_id, opts) do
|
|
GenServer.call(name, {:get_positions_without_elevation, min_id, opts})
|
|
end
|
|
|
|
def update_car(name, car, attrs, opts) do
|
|
GenServer.call(name, {:update_car, car, attrs, opts})
|
|
end
|
|
|
|
def get_latest_position(name, car) do
|
|
GenServer.call(name, {:get_latest_position, car})
|
|
end
|
|
|
|
# Callbacks
|
|
|
|
@impl true
|
|
def init(opts) do
|
|
state = %State{
|
|
pid: Keyword.fetch!(opts, :pid),
|
|
last_update: Keyword.fetch!(opts, :last_update)
|
|
}
|
|
|
|
{:ok, state}
|
|
end
|
|
|
|
@impl true
|
|
def handle_call({:start_state, _car, s, _} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Log.State{state: s, start_date: DateTime.utc_now()}}, state}
|
|
end
|
|
|
|
def handle_call({:get_current_state, _}, _from, state) do
|
|
{:reply, {:ok, %Log.State{state: :online, start_date: DateTime.from_unix!(0)}}, state}
|
|
end
|
|
|
|
def handle_call({:insert_position, _, attrs} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, struct!(Log.Position, attrs)}, state}
|
|
end
|
|
|
|
def handle_call({:insert_charge, _, _attrs} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Log.Charge{id: 222}}, state}
|
|
end
|
|
|
|
def handle_call({:start_charging_process, _, _, _} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %ChargingProcess{id: 99, start_date: DateTime.utc_now()}}, state}
|
|
end
|
|
|
|
def handle_call({:complete_charging_process, cproc} = action, _from, %State{} = state) do
|
|
send(state.pid, action)
|
|
new_cproc = %ChargingProcess{cproc | charge_energy_added: 45, end_date: DateTime.utc_now()}
|
|
{:reply, {:ok, new_cproc}, state}
|
|
end
|
|
|
|
def handle_call({:start_drive, _car} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Drive{id: 111}}, state}
|
|
end
|
|
|
|
def handle_call({:close_drive, _drive, _} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Drive{duration_min: 10, distance: 20.0}}, state}
|
|
end
|
|
|
|
def handle_call({:start_update, _car, _} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Update{id: 111}}, state}
|
|
end
|
|
|
|
def handle_call({:cancel_update, _update} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Update{}}, state}
|
|
end
|
|
|
|
def handle_call({:finish_update, _, _, _} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Update{}}, state}
|
|
end
|
|
|
|
def handle_call({:get_latest_update, _car}, _from, %State{last_update: update} = state) do
|
|
{:reply, update, state}
|
|
end
|
|
|
|
def handle_call({:insert_missed_update, _, _, _} = action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, {:ok, %Update{}}, state}
|
|
end
|
|
|
|
def handle_call({:get_positions_without_elevation, min_id, _opts}, _from, state) do
|
|
send(state.pid, {:get_positions_without_elevation, min_id})
|
|
{:reply, {[], nil}, state}
|
|
end
|
|
|
|
def handle_call({:update_car, car, attrs, _opts} = _action, _from, %State{pid: _pid} = state) do
|
|
result =
|
|
car
|
|
|> Car.changeset(attrs)
|
|
|> Ecto.Changeset.apply_changes()
|
|
|
|
{:reply, {:ok, result}, state}
|
|
end
|
|
|
|
def handle_call({:get_latest_position, _car}, _from, state) do
|
|
{:reply, %Position{latitude: 0.0, longitude: 0.0}, state}
|
|
end
|
|
|
|
def handle_call(action, _from, %State{pid: pid} = state) do
|
|
send(pid, action)
|
|
{:reply, :ok, state}
|
|
end
|
|
end
|