Skip to content

Commit

Permalink
Encode the Jaguar config as an asset (#270)
Browse files Browse the repository at this point in the history
  • Loading branch information
kasperl authored Sep 27, 2022
1 parent f4fb253 commit 59aa0fc
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 12 deletions.
40 changes: 34 additions & 6 deletions cmd/jag/commands/firmware.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package commands

import (
"context"
"encoding/json"
"fmt"
"io"
"io/ioutil"
Expand Down Expand Up @@ -157,19 +158,46 @@ func BuildFirmwareEnvelope(ctx context.Context, id string, name string, wifiSSID
return nil, err
}

// TODO(kasper): Can we generate this in a nicer way?
wifiProperties := "{ \"wifi.ssid\": \"" + wifiSSID + "\", \"wifi.password\": \"" + wifiPassword + "\" }"
configMap := map[string]interface{}{
"id": id,
"name": name,
}
configJson, err := json.Marshal(configMap)
if err != nil {
return nil, err
}

if err := runFirmwareTool(ctx, sdk, envelopePath, "container", "install", "-o", envelope.Name(), "jaguar", jaguarSnapshot); err != nil {
configJsonFile, err := os.CreateTemp("", "*.json.assets")
if err != nil {
return nil, err
}
if err := setFirmwareProperty(ctx, sdk, envelope, "uuid", id); err != nil {
defer configJsonFile.Close()

if err := os.WriteFile(configJsonFile.Name(), configJson, 0666); err != nil {
return nil, err
}

assetsFile, err := os.CreateTemp("", "*.assets")
if err != nil {
return nil, err
}
defer assetsFile.Close()

if err := runAssetsTool(ctx, sdk, assetsFile.Name(), "create"); err != nil {
return nil, err
}

if err := runAssetsTool(ctx, sdk, assetsFile.Name(), "add", "--ubjson", "config", configJsonFile.Name()); err != nil {
return nil, err
}
if err := setFirmwareProperty(ctx, sdk, envelope, "id", id); err != nil {

// TODO(kasper): Can we generate this in a nicer way?
wifiProperties := "{ \"wifi.ssid\": \"" + wifiSSID + "\", \"wifi.password\": \"" + wifiPassword + "\" }"

if err := runFirmwareTool(ctx, sdk, envelopePath, "container", "install", "--assets", assetsFile.Name(), "-o", envelope.Name(), "jaguar", jaguarSnapshot); err != nil {
return nil, err
}
if err := setFirmwareProperty(ctx, sdk, envelope, "name", name); err != nil {
if err := setFirmwareProperty(ctx, sdk, envelope, "uuid", id); err != nil {
return nil, err
}
if err := setFirmwareProperty(ctx, sdk, envelope, "wifi", wifiProperties); err != nil {
Expand Down
15 changes: 9 additions & 6 deletions src/jaguar.toit
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Use of this source code is governed by an MIT-style license that can be
// found in the LICENSE file.
import encoding.json
import http
import log
import net
Expand All @@ -13,6 +12,10 @@ import esp32
import uuid
import monitor

import encoding.json
import encoding.ubjson

import system.assets
import system.containers
import system.firmware

Expand Down Expand Up @@ -98,23 +101,23 @@ serve arguments:
if arguments.size >= 1:
port = int.parse arguments[0]

image_config := {:}
if platform == PLATFORM_FREERTOS:
image_config = esp32.image_config or {:}
config := {:}
assets.decode.get "config" --if_present=: | encoded |
catch: config = ubjson.decode encoded

id/uuid.Uuid := uuid.NIL
if arguments.size >= 2:
id = uuid.parse arguments[1]
else:
id = image_config.get "id"
id = config.get "id"
--if_absent=: id
--if_present=: uuid.parse it

name/string := "unknown"
if arguments.size >= 3:
name = arguments[2]
else:
name = image_config.get "name" --if_absent=: name
name = config.get "name" --if_absent=: name

while true:
attempts ::= 3
Expand Down

0 comments on commit 59aa0fc

Please sign in to comment.