Skip to content

OTA binary files header/lzss handling #146

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
0ceb632
Initial support for OTA binary encoding
rjtokenring Feb 2, 2024
aefb91c
Code refactoring
rjtokenring Feb 2, 2024
83d5253
Added no-header feature in binary upload
rjtokenring Feb 2, 2024
d60dbd1
Added header decoder
rjtokenring Feb 2, 2024
f45dc5c
Added header verification before file upload
rjtokenring Feb 2, 2024
d1e29ce
Added header decoder
rjtokenring Feb 2, 2024
468894a
removed not required fields in print
rjtokenring Feb 2, 2024
0a78e71
Added unit tests
rjtokenring Feb 2, 2024
1256f1f
dependency update
rjtokenring Feb 2, 2024
17a7a87
rever go upgrade
rjtokenring Feb 2, 2024
6e3d64a
Revert "dependency update"
rjtokenring Feb 2, 2024
818fae9
Added support for more boards
rjtokenring Feb 5, 2024
7422325
better missing header check
rjtokenring Feb 6, 2024
8005b62
Removed debug log
rjtokenring Feb 6, 2024
5c9c70b
Merge branch 'main' into encode-ota-binary-file
rjtokenring Feb 6, 2024
c138bde
Upgraded go version
rjtokenring Feb 6, 2024
7121847
Merge branch 'main' into encode-ota-binary-file
rjtokenring Feb 16, 2024
ef4f6c2
Changed description
rjtokenring Feb 19, 2024
71fa11c
Merge branch 'main' into encode-ota-binary-file
rjtokenring Mar 12, 2024
9db2450
Code clean
rjtokenring Mar 12, 2024
d8c67d8
Merge branch 'main' into encode-ota-binary-file
rjtokenring Mar 13, 2024
be141e5
Code updates to include more header info
rjtokenring Apr 23, 2024
bfc50ab
Added licenses
rjtokenring Apr 23, 2024
3a05de7
Better ouput formatting based on format output
rjtokenring Apr 23, 2024
52b46ce
Fixed gomod
rjtokenring Apr 23, 2024
ac60fc2
Revert "Fixed gomod"
rjtokenring Apr 23, 2024
db83baf
Removing not needed license
rjtokenring Apr 23, 2024
eba69e5
Fixed typo in file name
rjtokenring Apr 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added no-header feature in binary upload
  • Loading branch information
rjtokenring committed Feb 2, 2024
commit 83d52534eff63efec55e57b3dc4753b1c05442d7
8 changes: 4 additions & 4 deletions cli/ota/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ import (
)

type encodeBinaryFlags struct {
FQBN string
file string
FQBN string
file string
}

func initEncodeBinaryCommand() *cobra.Command {
Expand Down Expand Up @@ -64,8 +64,8 @@ func runEncodeCommand(flags *encodeBinaryFlags) error {
}

params := &ota.EncodeParams{
FQBN: flags.FQBN,
File: flags.file,
FQBN: flags.FQBN,
File: flags.file,
}
otafile, err := ota.Encode(context.TODO(), params, cred)
if err != nil {
Expand Down
23 changes: 13 additions & 10 deletions cli/ota/massupload.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@ import (
)

type massUploadFlags struct {
deviceIDs []string
tags map[string]string
file string
deferred bool
fqbn string
deviceIDs []string
tags map[string]string
file string
deferred bool
fqbn string
doNotApplyHeader bool
}

func initMassUploadCommand() *cobra.Command {
Expand All @@ -64,6 +65,7 @@ func initMassUploadCommand() *cobra.Command {
massUploadCommand.Flags().StringVarP(&flags.file, "file", "", "", "Binary file (.bin) to be uploaded")
massUploadCommand.Flags().BoolVar(&flags.deferred, "deferred", false, "Perform a deferred OTA. It can take up to 1 week.")
massUploadCommand.Flags().StringVarP(&flags.fqbn, "fqbn", "b", "", "FQBN of the devices to update")
massUploadCommand.Flags().BoolVar(&flags.doNotApplyHeader, "no-header", false, "Do not apply header and compression to binary file before upload.")
massUploadCommand.MarkFlagRequired("file")
massUploadCommand.MarkFlagRequired("fqbn")
return massUploadCommand
Expand All @@ -73,11 +75,12 @@ func runMassUploadCommand(flags *massUploadFlags) error {
logrus.Infof("Uploading binary %s", flags.file)

params := &ota.MassUploadParams{
DeviceIDs: flags.deviceIDs,
Tags: flags.tags,
File: flags.file,
Deferred: flags.deferred,
FQBN: flags.fqbn,
DeviceIDs: flags.deviceIDs,
Tags: flags.tags,
File: flags.file,
Deferred: flags.deferred,
FQBN: flags.fqbn,
DoNotApplyHeader: flags.doNotApplyHeader,
}

cred, err := config.RetrieveCredentials()
Expand Down
15 changes: 9 additions & 6 deletions cli/ota/upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ import (
)

type uploadFlags struct {
deviceID string
file string
deferred bool
deviceID string
file string
deferred bool
doNotApplyHeader bool
}

func initUploadCommand() *cobra.Command {
Expand All @@ -52,6 +53,7 @@ func initUploadCommand() *cobra.Command {
uploadCommand.Flags().StringVarP(&flags.deviceID, "device-id", "d", "", "Device ID")
uploadCommand.Flags().StringVarP(&flags.file, "file", "", "", "Binary file (.bin) to be uploaded")
uploadCommand.Flags().BoolVar(&flags.deferred, "deferred", false, "Perform a deferred OTA. It can take up to 1 week.")
uploadCommand.Flags().BoolVar(&flags.doNotApplyHeader, "no-header", false, "Do not apply header and compression to binary file before upload.")
uploadCommand.MarkFlagRequired("device-id")
uploadCommand.MarkFlagRequired("file")
return uploadCommand
Expand All @@ -66,9 +68,10 @@ func runUploadCommand(flags *uploadFlags) error {
}

params := &ota.UploadParams{
DeviceID: flags.deviceID,
File: flags.file,
Deferred: flags.deferred,
DeviceID: flags.deviceID,
File: flags.file,
Deferred: flags.deferred,
DoNotApplyHeader: flags.doNotApplyHeader,
}
err = ota.Upload(context.TODO(), params, cred)
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions command/ota/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import (
)

type EncodeParams struct {
FQBN string
File string
FQBN string
File string
}

// Encode command is used to encode a firmware OTA
Expand Down
38 changes: 24 additions & 14 deletions command/ota/massupload.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"context"
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"

Expand All @@ -37,11 +36,12 @@ const (
// MassUploadParams contains the parameters needed to
// perform a Mass OTA upload.
type MassUploadParams struct {
DeviceIDs []string
Tags map[string]string
File string
Deferred bool
FQBN string
DeviceIDs []string
Tags map[string]string
File string
Deferred bool
DoNotApplyHeader bool
FQBN string
}

// Result of an ota upload on a device.
Expand All @@ -59,17 +59,27 @@ func MassUpload(ctx context.Context, params *MassUploadParams, cred *config.Cred
return nil, errors.New("cannot use both DeviceIDs and Tags. only one of them should be not nil")
}

// Generate .ota file
otaDir, err := ioutil.TempDir("", "")
_, err := os.Stat(params.File)
if err != nil {
return nil, fmt.Errorf("%s: %w", "cannot create temporary folder", err)
return nil, fmt.Errorf("file %s does not exists: %w", params.File, err)
}
otaFile := filepath.Join(otaDir, "temp.ota")
defer os.RemoveAll(otaDir)

err = Generate(params.File, otaFile, params.FQBN)
if err != nil {
return nil, fmt.Errorf("%s: %w", "cannot generate .ota file", err)
// Generate .ota file
var otaFile string
if params.DoNotApplyHeader {
otaFile = params.File
} else {
otaDir, err := os.MkdirTemp("", "")
if err != nil {
return nil, fmt.Errorf("%s: %w", "cannot create temporary folder", err)
}
otaFile := filepath.Join(otaDir, "temp.ota")
defer os.RemoveAll(otaDir)

err = Generate(params.File, otaFile, params.FQBN)
if err != nil {
return nil, fmt.Errorf("%s: %w", "cannot generate .ota file", err)
}
}

iotClient, err := iot.NewClient(cred)
Expand Down
36 changes: 23 additions & 13 deletions command/ota/upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ package ota
import (
"context"
"fmt"
"io/ioutil"
"os"
"path/filepath"

Expand All @@ -38,14 +37,20 @@ const (
// UploadParams contains the parameters needed to
// perform an OTA upload.
type UploadParams struct {
DeviceID string
File string
Deferred bool
DeviceID string
File string
Deferred bool
DoNotApplyHeader bool
}

// Upload command is used to upload a firmware OTA,
// on a device of Arduino IoT Cloud.
func Upload(ctx context.Context, params *UploadParams, cred *config.Credentials) error {
_, err := os.Stat(params.File)
if err != nil {
return fmt.Errorf("file %s does not exists: %w", params.File, err)
}

iotClient, err := iot.NewClient(cred)
if err != nil {
return err
Expand All @@ -56,16 +61,21 @@ func Upload(ctx context.Context, params *UploadParams, cred *config.Credentials)
return err
}

otaDir, err := ioutil.TempDir("", "")
if err != nil {
return fmt.Errorf("%s: %w", "cannot create temporary folder", err)
}
otaFile := filepath.Join(otaDir, "temp.ota")
defer os.RemoveAll(otaDir)
var otaFile string
if params.DoNotApplyHeader {
otaFile = params.File
} else {
otaDir, err := os.MkdirTemp("", "")
if err != nil {
return fmt.Errorf("%s: %w", "cannot create temporary folder", err)
}
otaFile = filepath.Join(otaDir, "temp.ota")
defer os.RemoveAll(otaDir)

err = Generate(params.File, otaFile, dev.Fqbn)
if err != nil {
return fmt.Errorf("%s: %w", "cannot generate .ota file", err)
err = Generate(params.File, otaFile, dev.Fqbn)
if err != nil {
return fmt.Errorf("%s: %w", "cannot generate .ota file", err)
}
}

file, err := os.Open(otaFile)
Expand Down