feat(dfu): add protocol constants and progress models

This commit is contained in:
2026-03-03 16:45:16 +01:00
parent 08405c879b
commit e704f27a96

View File

@ -10,14 +10,103 @@ const String universalShifterCommandCharacteristicUuid =
'0993826f-0ee4-4b37-9614-d13ecba40005'; '0993826f-0ee4-4b37-9614-d13ecba40005';
const String universalShifterGearRatiosCharacteristicUuid = const String universalShifterGearRatiosCharacteristicUuid =
'0993826f-0ee4-4b37-9614-d13ecba40006'; '0993826f-0ee4-4b37-9614-d13ecba40006';
const String universalShifterDfuControlCharacteristicUuid =
'0993826f-0ee4-4b37-9614-d13ecba40008';
const String universalShifterDfuDataCharacteristicUuid =
'0993826f-0ee4-4b37-9614-d13ecba40009';
const String universalShifterDfuAckCharacteristicUuid =
'0993826f-0ee4-4b37-9614-d13ecba4000a';
const String ftmsServiceUuid = '00001826-0000-1000-8000-00805f9b34fb'; const String ftmsServiceUuid = '00001826-0000-1000-8000-00805f9b34fb';
const int universalShifterDfuOpcodeStart = 0x01;
const int universalShifterDfuOpcodeFinish = 0x02;
const int universalShifterDfuOpcodeAbort = 0x03;
const int universalShifterDfuFrameSizeBytes = 64;
const int universalShifterDfuFramePayloadSizeBytes = 63;
const int universalShifterDfuFlagEncrypted = 0x01;
const int universalShifterDfuFlagSigned = 0x02;
const int errorSequence = 1; const int errorSequence = 1;
const int errorFtmsMissing = 2; const int errorFtmsMissing = 2;
const int errorPairingAuth = 3; const int errorPairingAuth = 3;
const int errorPairingEncrypt = 4; const int errorPairingEncrypt = 4;
const int errorFtmsRequiredCharMissing = 5; const int errorFtmsRequiredCharMissing = 5;
enum DfuUpdateState {
idle,
starting,
waitingForAck,
transferring,
finishing,
completed,
aborted,
failed,
}
class DfuUpdateFlags {
const DfuUpdateFlags({
this.encrypted = false,
this.signed = false,
});
final bool encrypted;
final bool signed;
int get rawValue {
var value = 0;
if (encrypted) {
value |= universalShifterDfuFlagEncrypted;
}
if (signed) {
value |= universalShifterDfuFlagSigned;
}
return value;
}
static DfuUpdateFlags fromRaw(int rawValue) {
return DfuUpdateFlags(
encrypted: (rawValue & universalShifterDfuFlagEncrypted) != 0,
signed: (rawValue & universalShifterDfuFlagSigned) != 0,
);
}
}
class DfuUpdateProgress {
const DfuUpdateProgress({
required this.state,
required this.totalBytes,
required this.sentBytes,
required this.lastAckedSequence,
required this.sessionId,
required this.flags,
this.errorMessage,
});
final DfuUpdateState state;
final int totalBytes;
final int sentBytes;
final int lastAckedSequence;
final int sessionId;
final DfuUpdateFlags flags;
final String? errorMessage;
double get fractionComplete {
if (totalBytes <= 0) {
return 0;
}
return sentBytes.clamp(0, totalBytes) / totalBytes;
}
int get percentComplete => (fractionComplete * 100).round();
bool get isTerminal =>
state == DfuUpdateState.completed ||
state == DfuUpdateState.aborted ||
state == DfuUpdateState.failed;
}
class ShifterErrorInfo { class ShifterErrorInfo {
const ShifterErrorInfo({ const ShifterErrorInfo({
required this.code, required this.code,