79 lines
2.2 KiB
Elixir
79 lines
2.2 KiB
Elixir
defmodule Augie.Sensor.IMU do
|
|
defstruct ~w[orientation accelerometer magnetometer gyroscope gravity linear_acceleration temperature]a
|
|
alias __MODULE__
|
|
|
|
@moduledoc """
|
|
Storage struct for IMU sensor telemetry.
|
|
"""
|
|
|
|
@type t :: %IMU{
|
|
orientation: Quaternion.t(),
|
|
accelerometer: Vector.t(),
|
|
magnetometer: Vector.t(),
|
|
gyroscope: Vector.t(),
|
|
gravity: Vector.t(),
|
|
linear_acceleration: Vector.t(),
|
|
temperature: float
|
|
}
|
|
|
|
defmodule Quaternion do
|
|
@moduledoc "Holds the `x`, `y`, `z` and `w` values for a quaternion."
|
|
defstruct ~w[x y z w]a
|
|
@type t :: %__MODULE__{x: float, y: float, z: float, w: float}
|
|
end
|
|
|
|
defmodule Vector do
|
|
@moduledoc "Holds the `x`, `y` and `z` values for a vector."
|
|
defstruct ~w[x y z]a
|
|
@type t :: %__MODULE__{x: float, y: float, z: float}
|
|
end
|
|
|
|
@doc """
|
|
Convert incoming telemetry into a structure.
|
|
"""
|
|
@spec build([float]) :: {:ok, IMU.t()} | {:error, :bad_data}
|
|
def build([
|
|
orientation_x,
|
|
orientation_y,
|
|
orientation_z,
|
|
orientation_w,
|
|
accelerometer_x,
|
|
accelerometer_y,
|
|
accelerometer_z,
|
|
magnetometer_x,
|
|
magnetometer_y,
|
|
magnetometer_z,
|
|
gyroscope_x,
|
|
gyroscope_y,
|
|
gyroscope_z,
|
|
gravity_x,
|
|
gravity_y,
|
|
gravity_z,
|
|
linear_acceleration_x,
|
|
linear_acceleration_y,
|
|
linear_acceleration_z,
|
|
temperature
|
|
]) do
|
|
{:ok,
|
|
%IMU{
|
|
orientation: %Quaternion{
|
|
x: orientation_x,
|
|
y: orientation_y,
|
|
z: orientation_z,
|
|
w: orientation_w
|
|
},
|
|
accelerometer: %Vector{x: accelerometer_x, y: accelerometer_y, z: accelerometer_z},
|
|
magnetometer: %Vector{x: magnetometer_x, y: magnetometer_y, z: magnetometer_z},
|
|
gyroscope: %Vector{x: gyroscope_x, y: gyroscope_y, z: gyroscope_z},
|
|
gravity: %Vector{x: gravity_x, y: gravity_y, z: gravity_z},
|
|
linear_acceleration: %Vector{
|
|
x: linear_acceleration_x,
|
|
y: linear_acceleration_y,
|
|
z: linear_acceleration_z
|
|
},
|
|
temperature: temperature
|
|
}}
|
|
end
|
|
|
|
def build(_), do: {:error, :bad_data}
|
|
end
|