Skip to content

Commit b48bc6b

Browse files
committed
Merge remote-tracking branch 'origin/uploadRefactor'
2 parents dcef2d1 + d63e82b commit b48bc6b

File tree

6 files changed

+168
-29
lines changed

6 files changed

+168
-29
lines changed

commands/sketch/sync.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ func login() (string, string, error) {
448448

449449
logrus.Info("Searching for user credentials into the ~/.netrc file")
450450
arduinoMachine := NetRC.FindMachine("arduino.cc")
451-
if arduinoMachine.Name != "arduino.cc" {
451+
if arduinoMachine == nil || arduinoMachine.Name != "arduino.cc" {
452452
logrus.WithError(err).Error("Credentials not found")
453453
return "", "", errors.New("Credentials not found, try typing `arduino login` to login")
454454
}

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+
129+
packageName := fqbnParts[0]
130+
platformArch := fqbnParts[1]
131+
boardID := fqbnParts[2]
132+
133+
// Find package
134+
targetPackage := pm.packages.Packages[packageName]
135+
if targetPackage == nil {
136+
return nil, errors.New("unknown package " + packageName)
137+
}
138+
139+
// Find platform
140+
platform := targetPackage.Platforms[fqbnParts[1]]
141+
if platform == nil {
142+
return nil, fmt.Errorf("unknown platform %s:%s", packageName, platformArch)
143+
}
144+
platformRelease := platform.GetInstalled()
145+
if platformRelease == nil {
146+
return nil, fmt.Errorf("Platform %s:%s is not installed", packageName, platformArch)
147+
}
148+
149+
// Find board
150+
board := platformRelease.Boards[boardID]
151+
if board == nil {
152+
return nil, errors.New("board not found")
153+
}
154+
return board, nil
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+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
!arduino
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# See: http://code.google.com/p/arduino/wiki/Platforms
2+
3+
menu.cpu=Processor
4+
5+
uno.name=Arduino/Genuino Uno
6+
7+
uno.vid.0=0x2341
8+
uno.pid.0=0x0043
9+
uno.vid.1=0x2341
10+
uno.pid.1=0x0001
11+
uno.vid.2=0x2A03
12+
uno.pid.2=0x0043
13+
uno.vid.3=0x2341
14+
uno.pid.3=0x0243
15+
16+
uno.upload.tool=avrdude
17+
uno.upload.protocol=arduino
18+
uno.upload.maximum_size=32256
19+
uno.upload.maximum_data_size=2048
20+
uno.upload.speed=115200
21+
22+
uno.bootloader.tool=avrdude
23+
uno.bootloader.low_fuses=0xFF
24+
uno.bootloader.high_fuses=0xDE
25+
uno.bootloader.extended_fuses=0xFD
26+
uno.bootloader.unlock_bits=0x3F
27+
uno.bootloader.lock_bits=0x0F
28+
uno.bootloader.file=optiboot/optiboot_atmega328.hex
29+
30+
uno.build.mcu=atmega328p
31+
uno.build.f_cpu=16000000L
32+
uno.build.board=AVR_UNO
33+
uno.build.core=arduino
34+
uno.build.variant=standard
35+
36+
##############################################################
37+
38+
mega.name=Arduino/Genuino Mega or Mega 2560
39+
40+
mega.vid.0=0x2341
41+
mega.pid.0=0x0010
42+
mega.vid.1=0x2341
43+
mega.pid.1=0x0042
44+
mega.vid.2=0x2A03
45+
mega.pid.2=0x0010
46+
mega.vid.3=0x2A03
47+
mega.pid.3=0x0042
48+
mega.vid.4=0x2341
49+
mega.pid.4=0x0210
50+
mega.vid.5=0x2341
51+
mega.pid.5=0x0242
52+
53+
mega.upload.tool=avrdude
54+
mega.upload.maximum_data_size=8192
55+
56+
mega.bootloader.tool=avrdude
57+
mega.bootloader.low_fuses=0xFF
58+
mega.bootloader.unlock_bits=0x3F
59+
mega.bootloader.lock_bits=0x0F
60+
61+
mega.build.f_cpu=16000000L
62+
mega.build.core=arduino
63+
mega.build.variant=mega
64+
# default board may be overridden by the cpu menu
65+
mega.build.board=AVR_MEGA2560
66+
67+
## Arduino/Genuino Mega w/ ATmega2560
68+
## -------------------------
69+
mega.menu.cpu.atmega2560=ATmega2560 (Mega 2560)
70+
71+
mega.menu.cpu.atmega2560.upload.protocol=wiring
72+
mega.menu.cpu.atmega2560.upload.maximum_size=253952
73+
mega.menu.cpu.atmega2560.upload.speed=115200
74+
75+
mega.menu.cpu.atmega2560.bootloader.high_fuses=0xD8
76+
mega.menu.cpu.atmega2560.bootloader.extended_fuses=0xFD
77+
mega.menu.cpu.atmega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex
78+
79+
mega.menu.cpu.atmega2560.build.mcu=atmega2560
80+
mega.menu.cpu.atmega2560.build.board=AVR_MEGA2560
81+
82+
## Arduino Mega w/ ATmega1280
83+
## -------------------------
84+
mega.menu.cpu.atmega1280=ATmega1280
85+
86+
mega.menu.cpu.atmega1280.upload.protocol=arduino
87+
mega.menu.cpu.atmega1280.upload.maximum_size=126976
88+
mega.menu.cpu.atmega1280.upload.speed=57600
89+
90+
mega.menu.cpu.atmega1280.bootloader.high_fuses=0xDA
91+
mega.menu.cpu.atmega1280.bootloader.extended_fuses=0xF5
92+
mega.menu.cpu.atmega1280.bootloader.file=atmega/ATmegaBOOT_168_atmega1280.hex
93+
94+
mega.menu.cpu.atmega1280.build.mcu=atmega1280
95+
mega.menu.cpu.atmega1280.build.board=AVR_MEGA
96+
97+
##############################################################

0 commit comments

Comments
 (0)