There seem to be some edge cases when handling DFU protocol, so let's write the things down:
REQUEST Select { obj_type: Command }
RESPONSE DfuResponse { request: Select { obj_type: Command }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 512 }) }
REQUEST SetReceiptNotification { target: 0 }
RESPONSE DfuResponse { request: SetReceiptNotification { target: 0 }, result: Success, body: None }
REQUEST Create { obj_type: Command, obj_size: 79 }
RESPONSE DfuResponse { request: Create { obj_type: Command, obj_size: 79 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Crc
RESPONSE DfuResponse { request: Crc, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Execute
RESPONSE DfuResponse { request: Execute, result: Success, body: None }
REQUEST Select { obj_type: Data }
RESPONSE DfuResponse { request: Select { obj_type: Data }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 335872 }) }
REQUEST Create { obj_type: Data, obj_size: 61052 }
RESPONSE DfuResponse { request: Create { obj_type: Data, obj_size: 61052 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 120, crc: 1031809356 }) }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 240, crc: 4174146515 }) }
REQUEST Select { obj_type: Command }
RESPONSE DfuResponse { request: Select { obj_type: Command }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 512 }) }
REQUEST SetReceiptNotification { target: 0 }
RESPONSE DfuResponse { request: SetReceiptNotification { target: 0 }, result: Success, body: None }
REQUEST Create { obj_type: Command, obj_size: 79 }
RESPONSE DfuResponse { request: Create { obj_type: Command, obj_size: 79 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Crc
RESPONSE DfuResponse { request: Crc, result: Success, body: Some(Crc { offset: 79, crc: 2913568115 }) }
REQUEST Execute
RESPONSE DfuResponse { request: Execute, result: Success, body: None }
REQUEST SetReceiptNotification { target: 5 }
RESPONSE DfuResponse { request: SetReceiptNotification { target: 5 }, result: Success, body: None }
REQUEST Select { obj_type: Data }
RESPONSE DfuResponse { request: Select { obj_type: Data }, result: Success, body: Some(Select { offset: 0, crc: 0, max_size: 335872 }) }
REQUEST Create { obj_type: Data, obj_size: 61052 }
RESPONSE DfuResponse { request: Create { obj_type: Data, obj_size: 61052 }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: None }
REQUEST Write { data: [..] }
RESPONSE DfuResponse { request: Write { data: [..] }, result: Success, body: Some(Crc { offset: 600, crc: 2318566729 }) }
... hang ...