Skip to content

Commit 3d88eff

Browse files
authored
Added programmer.default directive to set a default programmer for a board. (#2416)
* Updated gRPC API * Implemented default programmer for boards * Added default programmer in board details CLI command * Implemented default programmer functionality in CLI * Added docs
1 parent 17f0189 commit 3d88eff

File tree

14 files changed

+242
-170
lines changed

14 files changed

+242
-170
lines changed

Diff for: arduino/cores/board.go

+7
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,10 @@ func (b *Board) IdentifyBoardConfiguration(query *properties.Map) *properties.Ma
241241
}
242242
return res
243243
}
244+
245+
// GetDefaultProgrammerID returns the board's default programmer as
246+
// defined in 'programmer.default' property of the board. If the board
247+
// has no default programmer the empty string is returned.
248+
func (b *Board) GetDefaultProgrammerID() string {
249+
return b.Properties.Get("programmer.default")
250+
}

Diff for: commands/board/details.go

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ func Details(ctx context.Context, req *rpc.BoardDetailsRequest) (*rpc.BoardDetai
140140
})
141141
}
142142

143+
details.DefaultProgrammerId = board.GetDefaultProgrammerID()
143144
details.Programmers = []*rpc.Programmer{}
144145
for id, p := range boardPlatformRelease.Programmers {
145146
details.Programmers = append(details.GetProgrammers(), &rpc.Programmer{

Diff for: docs/platform-specification.md

+18
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,24 @@ the [board and core platform](#platform-terminology) of the currently selected b
728728
platforms may now need to define copies of the programmers that were previously assumed to be provided by another
729729
platform.
730730

731+
### Set a default programmer for a board (since Arduino CLI >=0.35.0, Arduino IDE >=2.3.0)
732+
733+
A default programmer for each board may be specified through the `programmer.default` directive in the board definition:
734+
735+
```
736+
BOARD_ID.programmer.default=PROGRAMMER_ID
737+
```
738+
739+
The default programmer will be selected automatically if the user do not specifiy or select another programmer. This may
740+
be useful for boards with an on-board programmer/debugger.
741+
742+
For example if we want to set Atmel ICE as the default programmer for the Arduino UNO we would add the following line to
743+
the `boards.txt` file:
744+
745+
```
746+
uno.programmer.default=atmel-ice
747+
```
748+
731749
## Tools
732750

733751
The Arduino development software uses external command line tools to upload the compiled sketch to the board or to burn

Diff for: internal/cli/arguments/programmer.go

+24-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@
1515

1616
package arguments
1717

18-
import "github.com/spf13/cobra"
18+
import (
19+
"context"
20+
21+
"github.com/arduino/arduino-cli/commands/board"
22+
"github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
23+
"github.com/spf13/cobra"
24+
)
1925

2026
// Programmer contains the programmer flag data.
2127
// This is useful so all flags used by commands that need
@@ -32,7 +38,21 @@ func (p *Programmer) AddToCommand(cmd *cobra.Command) {
3238
})
3339
}
3440

35-
// String returns the programmer
36-
func (p *Programmer) String() string {
37-
return p.programmer
41+
// String returns the programmer specified by the user, or the default programmer
42+
// for the given board if defined.
43+
func (p *Programmer) String(inst *commands.Instance, fqbn string) string {
44+
if p.programmer != "" {
45+
return p.programmer
46+
}
47+
if inst == nil || fqbn == "" {
48+
return ""
49+
}
50+
details, err := board.Details(context.Background(), &commands.BoardDetailsRequest{
51+
Instance: inst,
52+
Fqbn: fqbn,
53+
})
54+
if err != nil {
55+
return ""
56+
}
57+
return details.GetDefaultProgrammerId()
3858
}

Diff for: internal/cli/board/details.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,11 @@ func (dr detailsResult) String() string {
197197
}
198198
}
199199

200+
green := color.New(color.FgGreen)
200201
tab.AddRow() // get some space from above
201202
for _, option := range details.ConfigOptions {
202203
tab.AddRow(tr("Option:"), option.OptionLabel, "", option.Option)
203204
for _, value := range option.Values {
204-
green := color.New(color.FgGreen)
205205
if value.Selected {
206206
tab.AddRow("",
207207
table.NewCell(value.ValueLabel, green),
@@ -216,9 +216,13 @@ func (dr detailsResult) String() string {
216216
}
217217
}
218218

219-
tab.AddRow(tr("Programmers:"), tr("ID"), tr("Name"))
219+
tab.AddRow(tr("Programmers:"), tr("ID"), tr("Name"), "")
220220
for _, programmer := range details.Programmers {
221-
tab.AddRow("", programmer.Id, programmer.Name)
221+
if programmer.Id == details.DefaultProgrammerID {
222+
tab.AddRow("", table.NewCell(programmer.Id, green), table.NewCell(programmer.Name, green), table.NewCell("✔ (default)", green))
223+
} else {
224+
tab.AddRow("", programmer.Id, programmer.Name)
225+
}
222226
}
223227

224228
return t.Render() + tab.Render()

Diff for: internal/cli/burnbootloader/burnbootloader.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func runBootloaderCommand(command *cobra.Command, args []string) {
7979
Port: discoveryPort,
8080
Verbose: verbose,
8181
Verify: verify,
82-
Programmer: programmer.String(),
82+
Programmer: programmer.String(instance, fqbn.String()),
8383
DryRun: dryRun,
8484
}, stdOut, stdErr); err != nil {
8585
feedback.Fatal(tr("Error during Upload: %v", err), feedback.ErrGeneric)

Diff for: internal/cli/compile/compile.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
276276
Verbose: verbose,
277277
Verify: verify,
278278
ImportDir: buildPath,
279-
Programmer: programmer.String(),
279+
Programmer: programmer.String(inst, fqbn),
280280
UserFields: fields,
281281
}
282282

Diff for: internal/cli/debug/debug.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func runDebugCommand(command *cobra.Command, args []string) {
8787
Port: port,
8888
Interpreter: interpreter,
8989
ImportDir: importDir,
90-
Programmer: programmer.String(),
90+
Programmer: programmer.String(instance, fqbn),
9191
}
9292

9393
if printInfo {

Diff for: internal/cli/feedback/result/rpc.go

+2
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ type BoardDetailsResponse struct {
418418
DebuggingSupported bool `json:"debugging_supported,omitempty"`
419419
IdentificationProperties []*BoardIdentificationProperties `json:"identification_properties,omitempty"`
420420
BuildProperties []string `json:"build_properties,omitempty"`
421+
DefaultProgrammerID string `json:"default_programmer_id,omitempty"`
421422
}
422423

423424
func NewBoardDetailsResponse(b *rpc.BoardDetailsResponse) *BoardDetailsResponse {
@@ -440,6 +441,7 @@ func NewBoardDetailsResponse(b *rpc.BoardDetailsResponse) *BoardDetailsResponse
440441
DebuggingSupported: b.GetDebuggingSupported(),
441442
IdentificationProperties: NewBoardIdentificationProperties(b.GetIdentificationProperties()),
442443
BuildProperties: b.GetBuildProperties(),
444+
DefaultProgrammerID: b.GetDefaultProgrammerId(),
443445
}
444446
}
445447

Diff for: internal/cli/upload/upload.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func runUploadCommand(args []string, uploadFieldsArgs map[string]string) {
188188
Verify: verify,
189189
ImportFile: importFile,
190190
ImportDir: importDir,
191-
Programmer: programmer.String(),
191+
Programmer: programmer.String(inst, fqbn),
192192
DryRun: dryRun,
193193
UserFields: fields,
194194
}

0 commit comments

Comments
 (0)