Created
November 21, 2019 13:58
-
-
Save benatwork/de53d02b71ab0c5b101941cbf0c7bd87 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// import { Machine, send } from 'xstate'; | |
//---------------------------------------- | |
const findingDevice = { | |
initial: 'findingDevice', | |
states: { | |
/* BASE STATES */ | |
foundDevice: { | |
type: 'final', | |
entry: send('DEVICE_FOUND') | |
}, | |
existingDeviceFound: { | |
entry: send('EXISTING_DEVICE_FOUND') | |
}, | |
/* ACTION STATES */ | |
findingDevice: { | |
on: { | |
BT_EXISTING_CONNECTION: 'existingDeviceFound', | |
BT_PREVIOUSLY_STORED_DEVICE_ID: 'foundDevice', | |
BT_NO_EXISTING_CONNECTION: 'scanning' | |
} | |
}, | |
scanning: { | |
on: { | |
BT_SCANNING_WARNING: 'scanningWarning', | |
BT_DEVICE_FOUND: 'foundDevice' | |
} | |
}, | |
scanningWarning: { | |
on: { | |
BT_SCANNING_TIMEOUT: 'deviceNotFound', | |
BT_DEVICE_FOUND: 'foundDevice' | |
} | |
}, | |
deviceNotFound: { | |
type: 'final', | |
on: { | |
BT_RESCANNING: 'findingDevice' | |
} | |
} | |
} | |
}; | |
const connectingToDevice = { | |
initial: 'connectingToDevice', | |
states: { | |
/* BASE STATES */ | |
connected: { | |
type: 'final' | |
}, | |
connectingError: { type: 'final' }, | |
connectingTimeout: { type: 'final' }, | |
bondingError: { type: 'final' }, | |
bondingTimeout: { type: 'final' }, | |
/* ACTION STATES */ | |
connectingToDevice: { | |
on: { | |
BT_CONNECTED: 'connected', | |
BT_ANDROID_CONNECTED: 'bonding', | |
BT_CONNECTED_ERROR: 'connectingError', | |
BT_CONNECTED_TIMEOUT: 'connectingTimeout' | |
} | |
}, | |
bonding: { | |
on: { | |
BT_BONDING_ERROR: 'bondingError', | |
BT_BONDING_TIMEOUT: 'bondingTimeout', | |
BT_CONNECTED: 'connected' | |
} | |
} | |
} | |
}; | |
const inittingDevice = { | |
initial: 'inittingDevice', | |
states: { | |
/* ACTION STATES */ | |
inittingDevice: { | |
on: { | |
BT_READING_SERVICES: 'readingServices', | |
} | |
}, | |
readingServices: { | |
on: { | |
BT_READING_BATTERY: 'readingBattery', | |
} | |
}, | |
readingBattery: { | |
on: { | |
BT_READING_FIRMWARE_VERSION: 'readingFirmwareVersion', | |
} | |
}, | |
readingFirmwareVersion: { | |
on: { | |
BT_READING_FIRMWARE_DATE: 'readingFirmwareDate', | |
} | |
}, | |
readingFirmwareDate: { | |
on: { | |
BT_CREATING_NOTIFICATIONS: 'creatingNotifications', | |
} | |
}, | |
creatingNotifications: { | |
on: { | |
BT_READING_DEVICE_STATE: 'readingDeviceState', | |
} | |
}, | |
readingDeviceState: { | |
on: { | |
BT_READING_DEVICE_LOGS: 'readingDeviceLogs', | |
} | |
}, | |
readingDeviceLogs: { | |
type: 'final' | |
}, | |
} | |
}; | |
const sessions = { | |
initial: 'sessionReady', | |
states: { | |
/* BASE STATES */ | |
sessionError: {}, | |
sessionReady: { | |
on: { | |
SYS_STATE_SESSION_START: 'startingSession', | |
} | |
}, | |
/* ACTION STATES */ | |
startingSession: { | |
on: { | |
SYS_STATE_SESSION_INHALING: 'sessionInhaling', | |
SYS_STATE_SESSION_ERROR: 'sessionError' | |
} | |
}, | |
sessionInhaling: { | |
on: { | |
SYS_STATE_SESSION_EXHALING: 'sessionExhaling', | |
SYS_STATE_SESSION_ERROR: 'sessionError' | |
} | |
}, | |
sessionExhaling: { | |
on: { | |
SYS_STATE_SESSION_DOSE_COMPLETE: 'sessionDoseComplete', | |
SYS_STATE_SESSION_ERROR: 'sessionError' | |
} | |
}, | |
sessionDoseComplete: { | |
on: { | |
SYS_STATE_SESSION_IN_PROGRESS: 'sessionInProgress', | |
SYS_STATE_SESSION_ERROR: 'sessionError' | |
} | |
}, | |
sessionInProgress: { | |
on: { | |
SYS_STATE_SESSION_START: 'startingSession', | |
SYS_STATE_SESSION_END: 'sessionReady', | |
SYS_STATE_SESSION_ERROR: 'sessionError' | |
} | |
} | |
} | |
}; | |
const cartridgeHandler = { | |
initial: 'validatingLocalCartridge', | |
states: { | |
/* BASE STATES */ | |
localCartridgeError: {}, | |
remoteCartridgeError: {}, | |
cartridgeValid: { | |
type: 'final' | |
}, | |
dosingProfileInvalid: { | |
type: 'final', | |
}, | |
/* ACTION STATES */ | |
validatingLocalCartridge: { | |
on: { | |
EVNT_INVLD_LOCAL_AUTH_FAILURE: 'localCartridgeError', | |
EVNT_INVLD_CARTRIDGE_EMPTY: 'localCartridgeError', | |
EVNT_INVLD_REMOTE_TIMEOUT: 'localCartridgeError', | |
EVNT_INLVD_CARTRIDGE_REMOVED: 'localCartridgeError', | |
EVNT_INVLD_READ_ERROR: 'localCartridgeError', | |
SYS_STATE_REMOTE_CARTRIDGE_AUTH: 'validatingRemoteCartridge' | |
} | |
}, | |
validatingRemoteCartridge: { | |
on: { | |
RMT_INVLD_GENERAL_ERROR: 'remoteCartridgeError', | |
RMT_INVLD_NO_DOSING_PROFILE: | |
'remoteCartridgeError', | |
RMT_VALIDATING_DOSING_PROFILE: 'validatingDosingProfile' | |
} | |
}, | |
validatingDosingProfile: { | |
on: { | |
SYS_STATE_READY: 'cartridgeValid', | |
INVALID_DOSING_PROFILE: 'dosingProfileInvalid', | |
} | |
} | |
} | |
}; | |
const ecosystemMachine = Machine({ | |
id: 'deviceEcoSystem', | |
initial: 'disconnected', | |
states: { | |
/* BASE STATES */ | |
disconnected: { | |
on: { | |
FIND_AND_CONNECT: 'connecting.findingDevice' | |
} | |
}, | |
charging: { | |
on: { | |
SYS_STATE_CHARGE_COMPLETE: 'connected.waitingForCartridge', | |
SYS_STATE_WAITING_FOR_CARTRIDGE: 'connected.waitingForCartridge' | |
} | |
}, | |
lowBattery: { | |
on: { | |
CHARGING: 'charging' | |
} | |
}, | |
connecting: { | |
on: { | |
CONNECTING_ERROR: 'disconnected', | |
DEVICE_CONNECTED: 'connected.waitingForCartridge', | |
DISCONNECT: 'disconnected', | |
LOW_BATT: 'lowBattery' | |
}, | |
states: { | |
findingDevice: { | |
on: { | |
EXISTING_DEVICE_FOUND: 'inittingDevice', | |
DEVICE_FOUND: 'connectingToDevice', | |
DEVICE_NOT_FOUND: 'deviceNotFound' | |
}, | |
...findingDevice | |
}, | |
connectingToDevice: { | |
on: { | |
BT_RESCANNING: 'findingDevice', | |
CONNECTED: 'inittingDevice' | |
}, | |
...connectingToDevice | |
}, | |
inittingDevice: { | |
on: { | |
DEVICE_INITTED: 'deviceInitted', | |
ERROR_INITTING: 'deviceReadTimeout', | |
DEVICE_READ_TIMEOUT: 'deviceReadTimeout' | |
}, | |
...inittingDevice | |
}, | |
deviceInitted: { | |
type: 'final', | |
entry: send('DEVICE_CONNECTED') | |
}, | |
deviceReadTimeout: { | |
on: { | |
BT_RESCANNING: 'findingDevice' | |
} | |
}, | |
deviceNotFound: { | |
type: 'final' | |
}, | |
connectingError: { | |
type: 'final' | |
}, | |
} | |
}, | |
connected: { | |
on: { | |
SYS_STATE_WAITING_FOR_CARTRIDGE: 'connected.waitingForCartridge', | |
SYS_STATE_OFF: 'disconnected', | |
DISCONNECT: 'disconnected', | |
CHARGING: 'charging', | |
LOW_BATT: 'lowBattery' | |
}, | |
states: { | |
waitingForCartridge: { | |
on: { | |
CARTRIDGE_CONNECTED: 'validatingCartridge', | |
}, | |
}, | |
validatingCartridge: { | |
on: { | |
CARTRIDGE_VALID: 'cartridgeValid', | |
CARTRIDGE_INVALID: 'invalidCartridge', | |
BAD_FILL_LEVEL_READ: 'badFillLevelRead' | |
}, | |
...cartridgeHandler | |
}, | |
badFillLevelRead: { | |
SYS_STATE_WAITING_FOR_CARTRIDGE: 'waitingForCartridge' | |
}, | |
invalidCartridge: { | |
on: { | |
SYS_STATE_WAITING_FOR_CARTRIDGE: 'waitingForCartridge' | |
} | |
}, | |
cartridgeValid: { | |
initial: 'deviceReady', | |
on: { | |
CARTRIDGE_INVALID: 'invalidCartridge', | |
CARTRIDGE_DISCONNECT: 'waitingForCartridge' | |
}, | |
states: { | |
deviceReady: { | |
on: { | |
START_SESSION: 'dosing', | |
} | |
}, | |
dosing: { | |
on: { | |
SESSION_END: 'deviceReady', | |
SESSION_ERROR: 'sessionError' | |
}, | |
...sessions | |
}, | |
sessionError: { | |
on: { | |
CONTINUE: 'deviceReady' | |
} | |
} | |
} | |
} | |
} | |
}, | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment