This repository has been archived on 2024-06-24. You can view files and clone it, but cannot push or open issues or pull requests.
augie/webapp/lib/augie/sensors/imu.ex
2020-03-08 15:05:20 +13:00

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