@@ -84,56 +84,87 @@ export const useWriteCommand = () => {
8484 bytes : Uint8Array ,
8585 setUpdateStatus : Dispatch < SetStateAction < string > >
8686 ) => {
87+ const formatTime = ( seconds : number ) : string => {
88+ const mins = Math . floor ( seconds / 60 ) ;
89+ const secs = Math . floor ( seconds % 60 ) ;
90+ return `${ mins } m ${ secs } s` ;
91+ } ;
92+
8793 setFileUploadBlocker ( true ) ;
8894 await write ( "fclose" , false ) ;
8995 await write ( `fopen ${ filePath } ` , false ) ;
90-
96+
9197 await write ( `fseek 0` , false ) ;
92-
98+
9399 let blob = new Blob ( [ bytes ] ) ;
94100 const arrayBuffer = await blob . arrayBuffer ( ) ;
95-
101+
96102 const chunkSize = 100000 ;
97-
103+ let successfulChunks = 0 ;
104+ let failedChunks = 0 ;
105+
98106 console . log ( "Total length: " , arrayBuffer . byteLength ) ;
99-
107+
100108 let startTime = Date . now ( ) ;
101109 let totalTime = 0 ;
102-
110+ let lastProgressUpdate = Date . now ( ) ;
111+
103112 for ( let i = 0 ; i < arrayBuffer . byteLength ; i += chunkSize ) {
104113 const chunk = arrayBuffer . slice ( i , i + chunkSize ) ;
105-
114+
106115 await write ( `fwb ${ chunk . byteLength } ` , false , true ) ;
107116 await serial . queueWriteAndResponseBinary ( new Uint8Array ( chunk ) ) ;
108-
117+ successfulChunks ++ ;
118+
109119 // calculate elapsed time and average time per chunk
110120 let elapsed = Date . now ( ) - startTime ;
111121 totalTime += elapsed ;
112122 let avgTimePerChunk = totalTime / ( i / chunkSize + 1 ) ;
113-
123+
114124 // estimate remaining time in seconds
115125 let remainingChunks = ( arrayBuffer . byteLength - i ) / chunkSize ;
116126 let estRemainingTime = ( remainingChunks * avgTimePerChunk ) / 1000 ;
117-
127+
118128 console . log (
119129 "Chunk done" ,
120130 i ,
121131 arrayBuffer . byteLength ,
122132 ( ( i / arrayBuffer . byteLength ) * 100 ) . toFixed ( 2 ) + "%" ,
123133 "Estimated time remaining: " + estRemainingTime . toFixed ( 0 ) + " seconds"
124134 ) ;
125- setUpdateStatus (
126- `${ ( ( i / arrayBuffer . byteLength ) * 100 ) . toFixed (
127- 2
128- ) } % Estimated time remaining: ${ estRemainingTime . toFixed ( 0 ) } seconds`
129- ) ;
130-
135+
136+ if ( Date . now ( ) - lastProgressUpdate > 500 ) {
137+ const percentComplete = ( i / arrayBuffer . byteLength ) * 100 ;
138+ const transferSpeed = ( i / totalTime ) * 1000 / 1024 ; // KB/s
139+
140+ setUpdateStatus (
141+ `π Upload Progress\n` +
142+ `βββββββββββββββββββββ\n` +
143+ `β‘ Progress: ${ percentComplete . toFixed ( 1 ) } %\n` +
144+ `π¦ Transferred: ${ ( i / 1024 ) . toFixed ( 1 ) } KB / ${ ( arrayBuffer . byteLength / 1024 ) . toFixed ( 1 ) } KB\n` +
145+ `π Speed: ${ transferSpeed . toFixed ( 1 ) } KB/s\n` +
146+ `β±οΈ Time Elapsed: ${ formatTime ( totalTime / 1000 ) } \n` +
147+ `β Time Remaining: ${ formatTime ( estRemainingTime ) } \n` +
148+ `β
Chunks: ${ successfulChunks } \n` +
149+ `β Retries: ${ failedChunks } `
150+ ) ;
151+ lastProgressUpdate = Date . now ( ) ;
152+ }
153+
131154 // reset start time for next iteration
132155 startTime = Date . now ( ) ;
133156 }
134157 console . log ( "FILE DONE" ) ;
135- setUpdateStatus ( `File upload complete!` ) ;
136-
158+
159+ setUpdateStatus (
160+ `β
Upload Complete!\n` +
161+ `βββββββββββββββββββββ\n` +
162+ `π¦ Total Size: ${ ( arrayBuffer . byteLength / 1024 ) . toFixed ( 1 ) } KB\n` +
163+ `β±οΈ Total Time: ${ formatTime ( totalTime / 1000 ) } \n` +
164+ `β
Successful Chunks: ${ successfulChunks } \n` +
165+ `β Failed Attempts: ${ failedChunks } `
166+ ) ;
167+
137168 await write ( "fclose" , false ) ;
138169 setFileUploadBlocker ( false ) ;
139170 } ;
0 commit comments