Skip to content

Commit e8a21e1

Browse files
authored
Merge pull request #10 from martinwork/from300
Fix for files not a multiple of 64 bytes - Version 3.0.7 (57)
2 parents 384e082 + 6af8f0f commit e8a21e1

File tree

2 files changed

+33
-18
lines changed

2 files changed

+33
-18
lines changed

src/main/AndroidManifest.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
android:versionCode="54"
3-
android:versionName="3.0.4" >
2+
android:versionCode="57"
3+
android:versionName="3.0.7" >
44

55
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
66
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>

src/main/java/org/microbit/android/partialflashing/PartialFlashingBaseService.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)