Skip to content

Commit 888b6fe

Browse files
committedApr 5, 2018
commands:upload Move function to search board by fqbn in packagemanager
Signed-off-by: Matteo Suppo <matteo.suppo@gmail.com>
1 parent ca27f48 commit 888b6fe

File tree

3 files changed

+69
-28
lines changed

3 files changed

+69
-28
lines changed
 

‎commands/upload/upload.go

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,6 @@ func run(command *cobra.Command, args []string) {
102102
formatter.PrintErrorMessage("Fully Qualified Board Name has incorrect format.")
103103
os.Exit(commands.ErrBadCall)
104104
}
105-
packageName := fqbnParts[0]
106-
coreName := fqbnParts[1]
107-
boardName := fqbnParts[2]
108105

109106
pm := commands.InitPackageManager()
110107
if err := pm.LoadHardware(); err != nil {
@@ -113,25 +110,9 @@ func run(command *cobra.Command, args []string) {
113110
}
114111

115112
// Find target board
116-
// TODO: Make a packagemanager function to do this
117-
targetPackage := pm.GetPackages().Packages[packageName]
118-
if targetPackage == nil {
119-
formatter.PrintErrorMessage("Unknown package " + packageName + ".")
120-
os.Exit(commands.ErrBadCall)
121-
}
122-
platform := targetPackage.Platforms[coreName]
123-
if platform == nil {
124-
formatter.PrintErrorMessage("Unknown platform " + packageName + ":" + coreName + ".")
125-
os.Exit(commands.ErrBadCall)
126-
}
127-
platformRelease := platform.GetInstalled()
128-
if platformRelease == nil {
129-
formatter.PrintErrorMessage("Platform " + packageName + ":" + coreName + " is not installed.")
130-
os.Exit(commands.ErrBadCall)
131-
}
132-
board := platformRelease.Boards[boardName]
133-
if board == nil {
134-
formatter.PrintErrorMessage("Unknown board " + packageName + ":" + coreName + ":" + boardName + ".")
113+
board, err := pm.FindBoardWithFQBN(fqbn)
114+
if err != nil {
115+
formatter.PrintError(err, "Invalid FQBN.")
135116
os.Exit(commands.ErrBadCall)
136117
}
137118

@@ -160,7 +141,7 @@ func run(command *cobra.Command, args []string) {
160141
var referencedPlatformRelease *cores.PlatformRelease
161142
var uploadTool *cores.Tool
162143
if split := strings.Split(uploadToolID, ":"); len(split) == 1 {
163-
uploadTool = targetPackage.Tools[uploadToolID]
144+
uploadTool = board.PlatformRelease.Platform.Package.Tools[uploadToolID]
164145
} else if len(split) == 2 {
165146
referencedPackage = pm.GetPackages().Packages[split[0]]
166147
if referencedPackage == nil {
@@ -169,7 +150,7 @@ func run(command *cobra.Command, args []string) {
169150
}
170151
uploadTool = referencedPackage.Tools[split[1]]
171152

172-
referencedPlatform = referencedPackage.Platforms[coreName]
153+
referencedPlatform = referencedPackage.Platforms[board.PlatformRelease.Platform.Architecture]
173154
if referencedPlatform != nil {
174155
referencedPlatformRelease = referencedPlatform.GetInstalled()
175156
}
@@ -193,8 +174,8 @@ func run(command *cobra.Command, args []string) {
193174
if referencedPlatformRelease != nil {
194175
uploadProperties.Merge(referencedPlatformRelease.Properties)
195176
}
196-
uploadProperties.Merge(platformRelease.Properties)
197-
uploadProperties.Merge(platformRelease.RuntimeProperties())
177+
uploadProperties.Merge(board.PlatformRelease.Properties)
178+
uploadProperties.Merge(board.PlatformRelease.RuntimeProperties())
198179
uploadProperties.Merge(boardProperties)
199180

200181
uploadToolProperties := uploadProperties.SubTree("tools." + uploadTool.Name)

‎cores/packagemanager/package_manager.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@
3030
package packagemanager
3131

3232
import (
33+
"errors"
3334
"fmt"
3435
"net/url"
35-
36-
"github.com/bcmi-labs/arduino-cli/configs"
36+
"strings"
3737

3838
"github.com/bcmi-labs/arduino-cli/common/releases"
39+
"github.com/bcmi-labs/arduino-cli/configs"
3940
"github.com/bcmi-labs/arduino-cli/cores"
4041
"github.com/bcmi-labs/arduino-cli/cores/packageindex"
4142
"github.com/sirupsen/logrus"
@@ -117,6 +118,42 @@ func (pm *PackageManager) FindBoardsWithID(id string) []*cores.Board {
117118
return res
118119
}
119120

121+
// FindBoardWithFQBN returns the board identified by the fqbn, or an error
122+
func (pm *PackageManager) FindBoardWithFQBN(fqbn string) (*cores.Board, error) {
123+
// Split fqbn
124+
fqbnParts := strings.Split(fqbn, ":")
125+
if len(fqbnParts) < 3 || len(fqbnParts) > 4 {
126+
return nil, errors.New("incorrect format for fqbn")
127+
}
128+
packageName := fqbnParts[0]
129+
platformArch := fqbnParts[1]
130+
boardID := fqbnParts[2]
131+
132+
// Search for the board
133+
for _, targetPackage := range pm.packages.Packages {
134+
fmt.Println(targetPackage.Name, packageName)
135+
if targetPackage.Name != packageName {
136+
continue
137+
}
138+
for _, targetPlatform := range targetPackage.Platforms {
139+
if targetPlatform.Architecture != platformArch {
140+
continue
141+
}
142+
143+
platform := targetPlatform.GetInstalled()
144+
if platform == nil {
145+
return nil, errors.New("platform not installed")
146+
}
147+
for _, board := range platform.Boards {
148+
if board.BoardId == boardID {
149+
return board, nil
150+
}
151+
}
152+
}
153+
}
154+
return nil, errors.New("board not found")
155+
}
156+
120157
// FIXME add an handler to be invoked on each verbose operation, in order to let commands display results through the formatter
121158
// as for the progress bars during download
122159
func (pm *PackageManager) RegisterEventHandler(eventHandler EventHandler) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package packagemanager_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/bcmi-labs/arduino-cli/cores/packagemanager"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestFindBoardWithFQBN(t *testing.T) {
11+
pm := packagemanager.NewPackageManager()
12+
pm.LoadHardwareFromDirectory("testdata")
13+
14+
board, err := pm.FindBoardWithFQBN("arduino:avr:uno")
15+
require.Nil(t, err)
16+
require.NotNil(t, board)
17+
require.Equal(t, board.Name(), "Arduino/Genuino Uno")
18+
19+
board, err = pm.FindBoardWithFQBN("arduino:avr:mega")
20+
require.Nil(t, err)
21+
require.NotNil(t, board)
22+
require.Equal(t, board.Name(), "Arduino/Genuino Mega or Mega 2560")
23+
}

0 commit comments

Comments
 (0)