@@ -711,6 +711,7 @@ private int attemptPartialFlash(String filePath) {
711711
712712 // TODO - check size of code in file matches micro:bit
713713
714+ boolean endOfFile = false ;
714715 long startTime = SystemClock .elapsedRealtime ();
715716 while (true ) {
716717 // Timeout if total is > 30 seconds
@@ -720,19 +721,30 @@ private int attemptPartialFlash(String filePath) {
720721 }
721722
722723 // Check if EOF
723- if (hex .getRecordTypeFromIndex ( dataPos .line + lineCount ) != 0 ) {
724- break ;
724+ if ( endOfFile || hex .getRecordTypeFromIndex ( dataPos .line + lineCount ) != 0 ) {
725+ if ( count == 0 ) {
726+ break ;
727+ }
728+ endOfFile = true ;
725729 }
726730
727- addrLo = hex .getRecordAddressFromIndex ( dataPos .line + lineCount );
728- addrHi = hex .getSegmentAddress (dataPos .line + lineCount );
729- addr = (long ) addrLo + (long ) addrHi * 256 * 256 ;
730-
731- hexData = hex .getDataFromIndex ( dataPos .line + lineCount );
732- if ( part + 32 > hexData .length ()) {
733- partData = hexData .substring ( part );
731+ if ( endOfFile ) {
732+ // complete the batch of 4 packets with FF
733+ char [] c32 = new char [32 ];
734+ Arrays .fill ( c32 , 'F' );
735+ hexData = new String ( c32 );
736+ partData = hexData ;
734737 } else {
735- partData = hexData .substring (part , part + 32 );
738+ addrLo = hex .getRecordAddressFromIndex (dataPos .line + lineCount );
739+ addrHi = hex .getSegmentAddress (dataPos .line + lineCount );
740+ addr = (long ) addrLo + (long ) addrHi * 256 * 256 ;
741+
742+ hexData = hex .getDataFromIndex (dataPos .line + lineCount );
743+ if (part + 32 > hexData .length ()) {
744+ partData = hexData .substring (part );
745+ } else {
746+ partData = hexData .substring (part , part + 32 );
747+ }
736748 }
737749
738750 int offsetToSend = 0 ;
@@ -748,7 +760,7 @@ private int attemptPartialFlash(String filePath) {
748760 offsetToSend = addr0Hi ;
749761 }
750762
751- logi ( packetNum + " " + count + " addr0 " + addr0 + " offsetToSend " + offsetToSend + " line " + lineCount + " addr " + addr + " part " + part + " data " + partData );
763+ logi ( packetNum + " " + count + " addr0 " + addr0 + " offsetToSend " + offsetToSend + " line " + lineCount + " addr " + addr + " part " + part + " data " + partData + " endOfFile " + endOfFile );
752764
753765 // recordToByteArray() builds a PF command block with the data
754766 byte [] chunk = HexUtils .recordToByteArray (partData , offsetToSend , packetNum );
@@ -792,12 +804,15 @@ private int attemptPartialFlash(String filePath) {
792804 if (packetState == PACKET_STATE_RETRANSMIT ) {
793805 lineCount = line0 ;
794806 part = part0 ;
807+ endOfFile = false ;
795808 } else {
796- // Next part
797- part = part + partData .length ();
798- if ( part >= hexData .length ()) {
799- part = 0 ;
800- lineCount = lineCount + 1 ;
809+ if ( !endOfFile ) {
810+ // Next part
811+ part = part + partData .length ();
812+ if (part >= hexData .length ()) {
813+ part = 0 ;
814+ lineCount = lineCount + 1 ;
815+ }
801816 }
802817 }
803818
0 commit comments