Skip to content

Commit e55549e

Browse files
commands: use the new endpoint to detect boards
1 parent 3eecf20 commit e55549e

File tree

2 files changed

+30
-25
lines changed

2 files changed

+30
-25
lines changed

commands/service_board_identify.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func identifyViaCloudAPI(ctx context.Context, props *properties.Map, settings *c
130130
}
131131

132132
var (
133-
vidPidURL = "https://builder.arduino.cc/v3/boards/byVidPid"
133+
vidPidURL = "https://api2.arduino.cc/boards/v1/boards"
134134
validVidPid = regexp.MustCompile(`0[xX][a-fA-F\d]{4}`)
135135
)
136136

@@ -169,7 +169,7 @@ func apiByVidPid(ctx context.Context, vid, pid string, settings *configuration.S
169169
return nil, errors.New(i18n.Tr("Invalid pid value: '%s'", pid))
170170
}
171171

172-
url := fmt.Sprintf("%s/%s/%s", vidPidURL, vid, pid)
172+
url := fmt.Sprintf("%s?vid-pid=%s-%s", vidPidURL, vid, pid)
173173
req, _ := http.NewRequest("GET", url, nil)
174174
req.Header.Set("Content-Type", "application/json")
175175

@@ -198,20 +198,23 @@ func apiByVidPid(ctx context.Context, vid, pid string, settings *configuration.S
198198
return nil, err
199199
}
200200

201-
var dat map[string]interface{}
201+
type boardsResponse struct {
202+
Items []struct {
203+
Name string `json:"name"`
204+
FQBN string `json:"fqbn"`
205+
} `json:"items"`
206+
}
207+
var dat boardsResponse
202208
if err := json.Unmarshal(resp, &dat); err != nil {
203209
return nil, fmt.Errorf("%s: %w", i18n.Tr("error processing response from server"), err)
204210
}
205-
name, nameFound := dat["name"].(string)
206-
fqbn, fbqnFound := dat["fqbn"].(string)
207-
if !nameFound || !fbqnFound {
208-
return nil, errors.New(i18n.Tr("wrong format in server response"))
209-
}
210211

211-
return []*rpc.BoardListItem{
212-
{
213-
Name: name,
214-
Fqbn: fqbn,
215-
},
216-
}, nil
212+
response := make([]*rpc.BoardListItem, len(dat.Items))
213+
for i, v := range dat.Items {
214+
if v.Name == "" || v.FQBN == "" {
215+
return nil, errors.New(i18n.Tr("wrong format in server response"))
216+
}
217+
response[i] = &rpc.BoardListItem{Name: v.Name, Fqbn: v.FQBN}
218+
}
219+
return response, nil
217220
}

commands/service_board_identify_test.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,27 @@ func TestGetByVidPid(t *testing.T) {
3535
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
3636
fmt.Fprintln(w, `
3737
{
38-
"architecture": "samd",
39-
"fqbn": "arduino:samd:mkr1000",
40-
"href": "/v3/boards/arduino:samd:mkr1000",
41-
"id": "mkr1000",
42-
"name": "Arduino/Genuino MKR1000",
43-
"package": "arduino",
44-
"plan": "create-free"
38+
"items": [
39+
{
40+
"fqbn": "arduino:avr:uno",
41+
"vendor": "arduino",
42+
"architecture": "avr",
43+
"board_id": "uno",
44+
"name": "Arduino Uno"
45+
}
46+
]
4547
}
4648
`)
4749
}))
4850
defer ts.Close()
4951

5052
vidPidURL = ts.URL
5153
settings := configuration.NewSettings()
52-
res, err := apiByVidPid(context.Background(), "0xf420", "0XF069", settings)
54+
res, err := apiByVidPid(context.Background(), "0x2341", "0x0043", settings)
5355
require.Nil(t, err)
5456
require.Len(t, res, 1)
55-
require.Equal(t, "Arduino/Genuino MKR1000", res[0].GetName())
56-
require.Equal(t, "arduino:samd:mkr1000", res[0].GetFqbn())
57+
require.Equal(t, "Arduino Uno", res[0].GetName())
58+
require.Equal(t, "arduino:avr:uno", res[0].GetFqbn())
5759

5860
// wrong vid (too long), wrong pid (not an hex value)
5961

@@ -95,7 +97,7 @@ func TestGetByVidPidMalformedResponse(t *testing.T) {
9597
settings := configuration.NewSettings()
9698

9799
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
98-
fmt.Fprintln(w, "{}")
100+
fmt.Fprintln(w, `{"items":[{}]}`)
99101
}))
100102
defer ts.Close()
101103

0 commit comments

Comments
 (0)