@@ -27,6 +27,8 @@ import (
27
27
"github.com/arduino/arduino-cli/table"
28
28
)
29
29
30
+ const progressBarMultiplier = 2
31
+
30
32
type (
31
33
OtaStatusResponse struct {
32
34
FirmwareSize * int64 `json:"firmware_size,omitempty"`
@@ -157,8 +159,12 @@ func (r OtaStatusDetail) String() string {
157
159
if len (r .Details ) > 0 {
158
160
t = table .New ()
159
161
t .SetHeader ("Time" , "Status" , "Detail" )
162
+ fwSize := int64 (0 )
163
+ if r .FirmwareSize != nil {
164
+ fwSize = * r .FirmwareSize
165
+ }
160
166
for _ , s := range r .Details {
161
- stateData := formatStateData (s .State , s .StateData , r . FirmwareSize , hasReachedFlashState (r .Details ))
167
+ stateData := formatStateData (s .State , s .StateData , fwSize , hasReachedFlashState (r .Details ))
162
168
t .AddRow (formatHumanReadableTs (s .Timestamp ), upperCaseFirst (s .State ), stateData )
163
169
}
164
170
output += "\n Details:\n " + t .Render ()
@@ -169,45 +175,50 @@ func (r OtaStatusDetail) String() string {
169
175
170
176
func hasReachedFlashState (states []State ) bool {
171
177
for _ , s := range states {
172
- if s .State == "flash" {
178
+ if s .State == "flash" || s . State == "reboot" {
173
179
return true
174
180
}
175
181
}
176
182
return false
177
183
}
178
184
179
- func formatStateData (state , data string , firmware_size * int64 , hasReceivedFlashState bool ) string {
185
+ func formatStateData (state , data string , firmware_size int64 , hasReceivedFlashState bool ) string {
180
186
if data == "" {
181
187
return ""
182
188
}
183
189
if state == "fetch" {
184
190
// This is the state 'fetch' of OTA progress. This contains a number that represents the number of bytes fetched
185
- if hasReceivedFlashState {
186
- return buildSimpleProgressBar (float64 (100 ))
187
- }
188
- if strings .ToLower (data ) == "unknown" {
191
+ if data == "Unknown" {
189
192
return ""
190
193
}
191
194
actualDownloadedData , err := strconv .Atoi (data )
192
- if err != nil || firmware_size == nil || actualDownloadedData <= 0 || * firmware_size <= 0 { // Sanitize and avoid division by zero
195
+ if err != nil || actualDownloadedData <= 0 || firmware_size <= 0 { // Sanitize and avoid division by zero
193
196
return data
194
197
}
195
- percentage := (float64 (actualDownloadedData ) / float64 (* firmware_size )) * 100
198
+ if hasReceivedFlashState {
199
+ return buildSimpleProgressBar (float64 (100 ))
200
+ }
201
+ percentage := (float64 (actualDownloadedData ) / float64 (firmware_size )) * 100
196
202
return buildSimpleProgressBar (percentage )
197
203
}
198
- if strings . ToLower ( data ) == "unknown " {
204
+ if data == "Unknown " {
199
205
return ""
200
206
}
201
207
return data
202
208
}
203
209
204
210
func buildSimpleProgressBar (progress float64 ) string {
205
211
progressInt := int (progress ) / 10
206
- bar := "["
207
- bar = bar + strings .Repeat ("=" , progressInt )
208
- bar = bar + strings .Repeat (" " , 10 - progressInt )
209
- bar = bar + "] " + strconv .FormatFloat (progress , 'f' , 2 , 64 ) + "%"
210
- return bar
212
+ progressInt = progressInt * progressBarMultiplier
213
+ maxProgress := 10 * progressBarMultiplier
214
+ var bar strings.Builder
215
+ bar .WriteString ("[" )
216
+ bar .WriteString (strings .Repeat ("=" , progressInt ))
217
+ bar .WriteString (strings .Repeat (" " , maxProgress - progressInt ))
218
+ bar .WriteString ("] " )
219
+ bar .WriteString (strconv .FormatFloat (progress , 'f' , 2 , 64 ))
220
+ bar .WriteString ("%" )
221
+ return bar .String ()
211
222
}
212
223
213
224
func upperCaseFirst (s string ) string {
0 commit comments