Skip to content

Commit 59aa0fc

Browse files
authored
Encode the Jaguar config as an asset (#270)
1 parent f4fb253 commit 59aa0fc

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

cmd/jag/commands/firmware.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package commands
66

77
import (
88
"context"
9+
"encoding/json"
910
"fmt"
1011
"io"
1112
"io/ioutil"
@@ -157,19 +158,46 @@ func BuildFirmwareEnvelope(ctx context.Context, id string, name string, wifiSSID
157158
return nil, err
158159
}
159160

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

163-
if err := runFirmwareTool(ctx, sdk, envelopePath, "container", "install", "-o", envelope.Name(), "jaguar", jaguarSnapshot); err != nil {
170+
configJsonFile, err := os.CreateTemp("", "*.json.assets")
171+
if err != nil {
164172
return nil, err
165173
}
166-
if err := setFirmwareProperty(ctx, sdk, envelope, "uuid", id); err != nil {
174+
defer configJsonFile.Close()
175+
176+
if err := os.WriteFile(configJsonFile.Name(), configJson, 0666); err != nil {
177+
return nil, err
178+
}
179+
180+
assetsFile, err := os.CreateTemp("", "*.assets")
181+
if err != nil {
182+
return nil, err
183+
}
184+
defer assetsFile.Close()
185+
186+
if err := runAssetsTool(ctx, sdk, assetsFile.Name(), "create"); err != nil {
187+
return nil, err
188+
}
189+
190+
if err := runAssetsTool(ctx, sdk, assetsFile.Name(), "add", "--ubjson", "config", configJsonFile.Name()); err != nil {
167191
return nil, err
168192
}
169-
if err := setFirmwareProperty(ctx, sdk, envelope, "id", id); err != nil {
193+
194+
// TODO(kasper): Can we generate this in a nicer way?
195+
wifiProperties := "{ \"wifi.ssid\": \"" + wifiSSID + "\", \"wifi.password\": \"" + wifiPassword + "\" }"
196+
197+
if err := runFirmwareTool(ctx, sdk, envelopePath, "container", "install", "--assets", assetsFile.Name(), "-o", envelope.Name(), "jaguar", jaguarSnapshot); err != nil {
170198
return nil, err
171199
}
172-
if err := setFirmwareProperty(ctx, sdk, envelope, "name", name); err != nil {
200+
if err := setFirmwareProperty(ctx, sdk, envelope, "uuid", id); err != nil {
173201
return nil, err
174202
}
175203
if err := setFirmwareProperty(ctx, sdk, envelope, "wifi", wifiProperties); err != nil {

src/jaguar.toit

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Use of this source code is governed by an MIT-style license that can be
33
// found in the LICENSE file.
44
5-
import encoding.json
65
import http
76
import log
87
import net
@@ -13,6 +12,10 @@ import esp32
1312
import uuid
1413
import monitor
1514

15+
import encoding.json
16+
import encoding.ubjson
17+
18+
import system.assets
1619
import system.containers
1720
import system.firmware
1821

@@ -98,23 +101,23 @@ serve arguments:
98101
if arguments.size >= 1:
99102
port = int.parse arguments[0]
100103

101-
image_config := {:}
102-
if platform == PLATFORM_FREERTOS:
103-
image_config = esp32.image_config or {:}
104+
config := {:}
105+
assets.decode.get "config" --if_present=: | encoded |
106+
catch: config = ubjson.decode encoded
104107

105108
id/uuid.Uuid := uuid.NIL
106109
if arguments.size >= 2:
107110
id = uuid.parse arguments[1]
108111
else:
109-
id = image_config.get "id"
112+
id = config.get "id"
110113
--if_absent=: id
111114
--if_present=: uuid.parse it
112115

113116
name/string := "unknown"
114117
if arguments.size >= 3:
115118
name = arguments[2]
116119
else:
117-
name = image_config.get "name" --if_absent=: name
120+
name = config.get "name" --if_absent=: name
118121

119122
while true:
120123
attempts ::= 3

0 commit comments

Comments
 (0)