diff options
author | Szczepan Zalega <szczepan@nitrokey.com> | 2016-10-14 13:35:13 +0200 |
---|---|---|
committer | Szczepan Zalega <szczepan@nitrokey.com> | 2016-10-19 16:34:11 +0200 |
commit | a8965c05ff8b69d6f0dc51e41655acf8b198869b (patch) | |
tree | a5a64c6a3d79a7b68689b99aa888cea170bafe4d | |
parent | b70c1e855a25abdf4c9e25d9c5275ac9866b4e2d (diff) | |
download | libnitrokey-a8965c05ff8b69d6f0dc51e41655acf8b198869b.tar.gz libnitrokey-a8965c05ff8b69d6f0dc51e41655acf8b198869b.tar.bz2 |
Handle NK Storage status sent on Storage commands
Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
-rw-r--r-- | include/device_proto.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/include/device_proto.h b/include/device_proto.h index ebe31df..6e99eaa 100644 --- a/include/device_proto.h +++ b/include/device_proto.h @@ -99,6 +99,13 @@ namespace nitrokey { union { uint8_t _padding[HID_REPORT_SIZE - 12]; ResponsePayload payload; + struct{ + uint8_t _storageStatusPadding[20-8+1]; //starts on 20th byte minus already 8 used + zero byte + uint8_t CommandCounter_u8; + uint8_t LastCommand_u8; + uint8_t Status_u8; //general status - idle0/ok1/busy2/wrongpassword3 + uint8_t ProgressBarValue_u8; + } StorageStatus __packed; } __packed; uint32_t crc; @@ -224,9 +231,40 @@ namespace nitrokey { while (retry-- > 0) { status = dev.recv(&resp); + if (dev.get_device_model() == DeviceModel::STORAGE && + resp.command_id >= 0x20 && +// resp.command_id <= 0x20 + 26 + resp.command_id < 0x60 + ){ + Log::instance()(std::string("Detected storage device cmd, status: ") + + std::to_string(resp.StorageStatus.Status_u8), Loglevel::DEBUG_L2); + + resp.last_command_status = 0; + switch(resp.StorageStatus.Status_u8){ + case 0: + case 1: + resp.last_command_status = 0; + resp.device_status = 0; + break; + case 2: + resp.last_command_status = 0; + resp.device_status = 1; //pro busy + break; + case 3: + case 4: + resp.last_command_status = 4; + resp.device_status = 0; + break; + }; + } + dev.set_last_command_status(resp.last_command_status); // FIXME should be handled on device.recv if (resp.device_status == 0 && resp.last_command_crc == outp.crc) break; + Log::instance()(std::string("Retry status: ") + + std::to_string(resp.device_status) + " " + + std::to_string(resp.last_command_crc==outp.crc), Loglevel::DEBUG_L2); + Log::instance()( "Device is not ready or received packet's last CRC is not equal to sent CRC packet, retrying...", Loglevel::DEBUG); |