Reprezentarea unui contor Bluetooth conectat (UM25C, UM34C, TC66C).
id (UUID) unic în aplicaţiemacAddress nu poate fi duplicat în Core Data (Cloud-Kit safe)OperationalState este monoton crescătoare: notPresent → ... → dataIsAvailableOperationalState este peripheralConnected sau mai mare, trebuie să existe o conexiune BT activănotPresent
↓
peripheralNotConnected
↓
peripheralConnectionPending
↓
peripheralConnected
↓
peripheralReady
↓
comunicating ↔ dataIsAvailable
| Proprietate | Tip | Descriere | Observaţii |
|---|---|---|---|
id |
UUID | Identificator unic | Generat la creare |
macAddress |
String | Adresa MAC BT | De ex: "AA:BB:CC:DD:EE:FF" |
meter |
Model | Tipul: UM25C, UM34C, TC66C | Immutable după creare |
meterName |
String | Nume ales de utilizator | Persistent în Core Data |
operationalState |
OperationalState | Starea curentă | Published, triggers UI updates |
lastDataPoint |
Measurement? | Ultima măsurătoare | Nullable |
connectionMetadata |
ConnectionMetadata? | Info conexiune curentă | Device, timestamp, expiry |
discoveryMetadata |
DiscoveryMetadata? | Info descoperire BT | Last seen, seen by |
temperatureUnit |
TemperatureUnitPreference | Unitatei temperatură | Celsius/Fahrenheit |
// Conectare
func connect()
// MUST: tranzițe starea la peripheralConnectionPending
// SHOULD: se conectează în max 5s
func disconnect()
// MUST: tranzițe starea la peripheralNotConnected
// MUST: eliberează resurse BT
// Citire măsurători
func requestMeasurement() -> Bool
// SHOULD: retur true dacă cererea a fost trimisă
// SHOULD: se așteaptă răspuns în max 3s (timeout)
// MUST: nu trimite dacă starea este < comunicating
func processMeasurementData(_ data: Data) -> Measurement?
// Parsează payload-ul de la dispozitiv
// MUST: retur nil dacă payload-ul e invalid
// SHOULD: loghează checksum errors
// Gestionare sesiuni
func startChargeRecord(for device: ChargedDevice) -> ChargeRecord
// Inițiază o nouă sesiune de încărcare
func endChargeRecord(_ record: ChargeRecord)
// Finalizează sesiunea
// Naming
func renameToMeter(_ newName: String)
// MUST: actualizează proprietatea şi persistă în Core Data
OperationalState < peripheralConnected, retry-ează conectareaperipheralNotConnected// Stări operaţionale
test_operationalStateTransition()
test_stateMonotonicity()
// Conectare
test_connectInitiatesPeripheralConnectionPending()
test_disconnectCleansUpResources()
test_reconnectWithBackoff()
// Măsurători
test_requestMeasurementFailsIfStateInvalid()
test_processMeasurementDataWithValidPayload()
test_measurementTimeout()
// Naming
test_renameUpdatesPersistence()
BluetoothManager: gestionează Core BluetoothChargeInsightsStore: salvează măsurătorileAppData: CloudKit sync