jpunie

jpunie

Resolving image paths which are defined as constant/static in Scenic on Raspberry PI with Nerves

Hello,

While testing the scenic example in combination with Nerves on a RPi3 with a touchscreen, it became clear that the images where not rendering. At first I thought it would be related to the Scenic RPI driver, but this was not the case. Debugging of the path variables resulted in a clear path resolving issue at compile time.

When looking a the default splash.ex the parrot image is loaded as follows:

 @parrot_path :code.priv_dir(:scenic_example)
               |> Path.join("/static/images/scenic_parrot.png")
 @parrot_hash Scenic.Cache.Support.Hash.file!(@parrot_path, :sha)

:code.priv_dir(:scenic_example) will result with a path on my local file system, not on the target.

I had to fix/change this path issue with a config, but maybe this can be done in a more elegant way. My current workaround:

config/config.exs:

config :scenic_example, :priv_dir, "./_build/dev/lib/scenic_example/priv/"

config/rpi3.exs:

config :scenic_example, :priv_dir, "/srv/erlang/lib/scenic_example-0.1.0/priv"

splash.ex:

@parrot_file "/static/images/scenic_parrot.png"
@parrot_path Application.get_env(:scenic_example, :priv_dir)
               |> Path.join(@parrot_file)
@parrot_hash_path :code.priv_dir(:scenic_example)
               |> Path.join(@parrot_file)
@parrot_hash Scenic.Cache.Support.Hash.file!(@parrot_hash_path, :sha)

The hash has to be calculated at compile time using the file on my local filesystem, hence the double paths.

What would be a more elegant solution to solve this?
Also when the application will be versioned, the path in rpi3.exs has to be changed also, which could be an issue in the future.
Removing the static definitions is always an option, but I think in general the static definitions will work better and easier in the future.

Most Liked

axelson

axelson

Scenic Core Team

Hi @jpunie, indeed that is a known issue/annoyance when working with Scenic, especially when also using Nerves. I wouldn’t worry too much about an elegant way to solve this because Scenic 0.11 is coming soon and how assets work is being re-written, in part because of this specific issue.

Here’s some relevant info:

Hey all. Just pushed an update to v0.11 that refactors the way static assets are built. The main change you will need to make is that most of the config is now moved into the assets.ex module itself.The main benefit is that you can now have multiple asset sources that are merged into the final library. This allows deps to have assets that get pulled into the final application. While I was there, the library format is now a struct and accessing the contents has simplified and has more descriptive function names. The main one you will need to update is that Static.fetch is now Static.meta, which is a better name since it retrieves the metadata. Fetch was ambiguous.Now that we can have multiple asset sources, roboto.ttf and roboto_mono.ttf are moved back into scenic itself and don’t need to be carried by the apps.

defmodule Example.Assets do
  use Scenic.Assets.Static,
    otp_app: :poncho_scenic,
    sources: [
      "assets",
      {:scenic, "apps/scenic/assets"}
    ],
    alias: [
      parrot: "images/parrot.jpg"
    ]
end

The sources: list above will point to your local assets folder and the scenic assets by default if you don’t include it.The required config is now just

config :scenic, :assets, module: PonchoScenic.Assets

I believe @boydm is also actively looking for feedback on the assets setup for 0.11, although he may almost be ready to wrap up that portion of work.

jpunie

jpunie

Hi @axelson,

Great and very valuable feedback. I will look further into the provided info. Also a welcome reminder to keep following the Elixir Slack.

Looking forward to the v0.11 release.

Thank you for all the effort you put into your projects and the support given.

Where Next?

Popular in Questions Top

Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
Werner
Hi, I’m using Ubuntu 18.04 and after updating to OTP-24.0 yesterday i have this warning when I run “mix local.hex”: 14:57:30.512 [warn] ...
New
gazoon
I want to know absolute current module path. In python i could do that: os.path.abspath(__file__) Does elixir have anything similar?
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

Other popular topics Top

JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
sacepums
Hey guys. I'm new to elixir and im really stocked about it. But I ran into a bit of problem - I need to convert a date sting, for examp...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> someth...
New

We're in Beta

About us Mission Statement