Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.imasdetres.gobike.model;
- import com.gobike.middleware.BikePCB;
- import com.gobike.middleware.DockingStation.SlaveState;
- import com.gobike.middleware.DockingStation.UncondChargingTimer;
- import com.gobike.middleware.Event;
- import com.gobike.middleware.BikePCB.BikeState;
- import com.gobike.middleware.DockingStation;
- import com.gobike.middleware.ReturnCode;
- import com.imasdetres.gobike.actions.bike.SetBikeStateAction;
- import com.imasdetres.util.BufferedLog;
- public class MetaState {
- private static final String TAG = MetaState.class.getSimpleName();
- enum MSBikeState {
- Unknown,
- Docked,
- Undocking,
- Running,
- Docking
- };
- private MSBikeState _bikeState = MSBikeState.Unknown;
- private void setBikeState(MSBikeState bikeState) {
- if (_bikeState != bikeState) {
- BufferedLog.log().i(TAG, "Bike state: "+_bikeState+" --> "+bikeState);
- if (bikeState == MSBikeState.Docked) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.BIKE_DOCKED));
- //TODO: trigger(DateTimeUpdater)
- } else if (bikeState == MSBikeState.Undocking) {
- Middleware.getInstance().setUndockPollingThread();
- } else if (bikeState == MSBikeState.Running) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.BIKE_UNDOCKED));
- } else if (bikeState == MSBikeState.Docking) {
- //TODO: Middleware.getInstance().setDockPollingThread();
- }
- _bikeState = bikeState;
- }
- }
- public MSBikeState bikeState() {
- return _bikeState;
- }
- enum MSChargeState {
- Unknown,
- NotCharging,
- Waiting,
- Charging,
- UnconditionalCharging,
- ChargingError
- }
- private boolean isChargingState(MSChargeState state) {
- return (state == MSChargeState.Charging ||
- state == MSChargeState.UnconditionalCharging);
- }
- private MSChargeState _chargeState = MSChargeState.Unknown;
- private void setChargeState(MSChargeState chargeState) {
- if (_chargeState != chargeState) {
- BufferedLog.log().i(TAG, "Charge state: "+_chargeState+" --> "+chargeState);
- boolean wasCharging = isChargingState(_chargeState);
- boolean isCharging = isChargingState(chargeState);
- boolean wasUnconditionalCharging = (_chargeState == MSChargeState.UnconditionalCharging);
- boolean isUnconditionalCharging = (chargeState == MSChargeState.UnconditionalCharging);
- if (!wasCharging && isCharging) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.BIKE_STARTED_CHARGING));
- setCanUndock(false, CantUndockReason.BikeCharging);
- } else if (wasCharging && !isCharging) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.BIKE_STOPPED_CHARGING));
- }
- if (!wasUnconditionalCharging && isUnconditionalCharging) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.SLAVEPCB_UNCONDITIONAL_CHARGING));
- } else if (wasUnconditionalCharging && !isUnconditionalCharging) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.SLAVEPCB_UNCONDITIONAL_CHARGING_FINISHED));
- }
- if (chargeState == MSChargeState.ChargingError) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.ERROR_CHARGING));
- }
- _chargeState = chargeState;
- }
- }
- public MSChargeState chargeState() {
- return _chargeState;
- }
- enum MSLockState {
- Unknown,
- Unlocked,
- WaitingUser,
- Locked
- }
- private MSLockState _lockState = MSLockState.Unknown;
- private void setLockState(MSLockState lockState) {
- if (_lockState != lockState) {
- BufferedLog.log().i(TAG, "Lock state: "+_lockState+" --> "+lockState);
- if (lockState == MSLockState.Unlocked) {
- Middleware.getInstance().sendEvent(new Event(BikePCB.LOCK_DISABLED));
- } else if (lockState == MSLockState.WaitingUser) {
- Middleware.getInstance().sendEvent(new Event(BikePCB.LOCK_WAITING_USER));
- } else if (lockState == MSLockState.Locked) {
- Middleware.getInstance().sendEvent(new Event(BikePCB.LOCK_ENABLED));
- }
- _lockState = lockState;
- }
- }
- public MSLockState lockState() {
- return _lockState;
- }
- public boolean isLocked() {
- return _lockState == MSLockState.Locked;
- }
- private boolean _slaveUnavailable = false;
- private void setSlaveUnavailable(boolean slaveUnavailable) {
- if (_slaveUnavailable != slaveUnavailable) {
- BufferedLog.log().i(TAG, "Slave unavailable: "+_slaveUnavailable+" --> "+slaveUnavailable);
- if (slaveUnavailable) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.SLAVE_UNAVAILABLE));
- setCanUndock(false);
- }
- _slaveUnavailable = slaveUnavailable;
- }
- }
- public boolean isSlaveUnavailable() {
- return _slaveUnavailable;
- }
- private boolean _standing = false;
- private void setStanding(boolean standing) {
- if (_standing != standing) {
- BufferedLog.log().i(TAG, "Bike standing: "+_standing+" --> "+standing);
- if (standing) {
- Middleware.getInstance().sendEvent(new Event(BikePCB.KICKSTAND_DEPLOYED));
- } else {
- Middleware.getInstance().sendEvent(new Event(BikePCB.KICKSTAND_RETRACTED));
- }
- _standing = standing;
- }
- }
- public boolean isStanding() {
- return _standing;
- }
- enum CantUndockReason {
- None,
- BikeNotPushedIn,
- BikeNotDocked,
- BikeCharging
- }
- private boolean _canUndock = false;
- private CantUndockReason _cantUndockReason = CantUndockReason.None;
- private void setCanUndock(boolean canUndock) {
- setCanUndock(canUndock, CantUndockReason.None);
- }
- private void setCanUndock(boolean canUndock, CantUndockReason reason) {
- if (_canUndock != canUndock) {
- BufferedLog.log().i(TAG, "Can undock: "+_canUndock+" --> "+canUndock + " (Reason: "+reason+")");
- _canUndock = canUndock;
- }
- _cantUndockReason = reason;
- }
- public boolean canUndock() {
- return _canUndock;
- }
- /**
- * This is the main algorithm discussed in http://redmine.imasdetres.com/issues/5451
- * It's the central point in charge of updating the Middleware MetaState according to
- * the state reported by the electronics
- */
- public void update() {
- BikePCB.BikeState bikeStatus = Bike_PCB.getInstance().getState();
- DockingStation.SlaveState slaveStatus = SlaveController.getInstance().getState();
- /*int bikeDigitalInputs = 0;
- try {
- bikeDigitalInputs = BikePCB.getDigitalInputStatus();
- } catch (NullPointerException e) {
- BufferedLog.log().e(TAG, "Coult not retrieve BikePCB digital input status");
- return;
- }*/
- int slaveDigitalInputs = SlaveController.getInstance().getDigitalInputs();
- int syncTimer = SlaveController.getInstance().getSyncTimer();
- if (bikeStatus == BikeState.BIKE_SLAVE_UNAVAILABLE) {
- setBikeState(MSBikeState.Docked);
- setChargeState(MSChargeState.NotCharging);
- setSlaveUnavailable(true);
- } else if (bikeStatus == BikeState.BIKE_SLAVE_UNCOND_CHARGING) {
- setBikeState(MSBikeState.Docked);
- setChargeState(MSChargeState.UnconditionalCharging);
- setSlaveUnavailable(true);
- } else if (syncTimer != 0xFF) {
- if (bikeStatus == BikeState.BIKE_ERROR_ASSOC) {
- if (bikeState() == MSBikeState.Undocking) {
- SetBikeStateAction setBikeStateAction = new SetBikeStateAction(BikeState.BIKE_RUNNING);
- if (setBikeStateAction.execute() != ReturnCode.RET_OK)
- BufferedLog.log().e(TAG, "Error setting BikePCB state to BIKE_RUNNING");
- setBikeState(MSBikeState.Running);
- } else if (bikeState() == MSBikeState.Docked) {
- setSlaveUnavailable(true);
- }
- } else {
- bikeDocking(bikeStatus, slaveStatus, slaveDigitalInputs, syncTimer);
- }
- } else if (bikeStatus == BikeState.BIKE_12V_PROBE) {
- if (bikeState() == MSBikeState.Undocking) {
- setBikeState(MSBikeState.Running);
- }
- } else if (bikeStatus == BikeState.BIKE_ERROR_NOT_BIKE) {
- setBikeState(MSBikeState.Running);
- Middleware.getInstance().sendEvent(new Event(DockingStation.ERROR_DOCK_FAILED));
- } else if (bikeStatus == BikeState.BIKE_42V_PROBE) {
- if (bikeState() == MSBikeState.Running) {
- setBikeState(MSBikeState.Docking);
- }
- } else if (bikeStatus == BikeState.BIKE_DISASSOC || bikeStatus == BikeState.BIKE_UNDOCKING) {
- setBikeState(MSBikeState.Undocking);
- } else if (bikeState() == MSBikeState.Docked) {
- setSlaveUnavailable(true);
- } else if (bikeState() != MSBikeState.Running) {
- setBikeState(MSBikeState.Running);
- } else if (bikeStatus == BikeState.BIKE_RUNNING) {
- setStanding(false);
- setBikeState(MSBikeState.Running);
- setLockState(MSLockState.Unlocked);
- } else if (bikeStatus == BikeState.BIKE_STANDING) {
- setStanding(true);
- setBikeState(MSBikeState.Running);
- setLockState(MSLockState.Unlocked);
- } else if (bikeStatus == BikeState.BIKE_LOCKED || bikeStatus == BikeState.BIKE_LOCKED_WAKEUP) {
- setLockState(MSLockState.Locked);
- if (bikeStatus == BikeState.BIKE_LOCKED) {
- setStanding(true);
- } else if (bikeStatus == BikeState.BIKE_LOCKED_WAKEUP) {
- setStanding(false);
- }
- } else if (bikeStatus == BikeState.BIKE_MAKE_LOCK_3) {
- setLockState(MSLockState.WaitingUser);
- } else if (bikeStatus == BikeState.BIKE_ERROR_LOCK_TAMPER || bikeStatus == BikeState.BIKE_ERROR_UNLOCK_3) {
- if (_lockState == MSLockState.Locked) {
- Middleware.getInstance().sendEvent(new Event(BikePCB.LOCK_ERROR));
- } else {
- Middleware.getInstance().sendEvent(new Event(BikePCB.LOCK_CONSISTENCY_CERROR));
- }
- } else if (bikeStatus == BikeState.BIKE_ERROR_LOCK_CURRENT) {
- Middleware.getInstance().sendEvent(new Event(BikePCB.LOCK_ERROR));
- }
- }
- private void bikeDocking(BikePCB.BikeState bikeStatus, DockingStation.SlaveState slaveStatus, int slavePCBDigitalInputStatus, int syncTimer) {
- if (syncTimer >= 0x05 && syncTimer <= 0x07) {
- assertDocking();
- if (bikeStatus == BikeState.BIKE_CHARGING) {
- assertCharging(bikeStatus, slaveStatus);
- } else if (slaveStatus == SlaveState.SLAVE_START_CHARGING ||
- slaveStatus == SlaveState.SLAVE_START_CHARGING_WAIT ||
- slaveStatus == SlaveState.SLAVE_UNCONDITIONAL_CHARGING_WAIT) {
- setChargeState(MSChargeState.Waiting);
- } else if (slaveStatus == SlaveState.SLAVE_BIKE_CHARGING) {
- if (bikeStatus == BikeState.BIKE_DOCKING) {
- setChargeState(MSChargeState.ChargingError);
- } else {
- assertCharging(bikeStatus, slaveStatus);
- }
- } else if (slaveStatus == SlaveState.SLAVE_ERROR_ASSOC_42V) {
- Middleware.getInstance().sendEvent(new Event(DockingStation.ERROR_ASSOC_42V));
- setChargeState(MSChargeState.ChargingError);
- } else if (slaveStatus == SlaveState.SLAVE_ERROR_CHARGING ||
- slaveStatus == SlaveState.SLAVE_ERROR_CHARGE_CURRENT) {
- setChargeState(MSChargeState.ChargingError);
- } else if (slaveStatus == SlaveState.SLAVE_ERROR_TEMP_SENSOR ||
- slaveStatus == SlaveState.SLAVE_ERROR_CHARGE_CURRENT ||
- slaveStatus == SlaveState.SLAVE_ERROR_LEFT_SOLENOID ||
- slaveStatus == SlaveState.SLAVE_ERROR_RIGHT_SOLENOID ||
- slaveStatus == SlaveState.SLAVE_ERROR_HEATER ||
- slaveStatus == SlaveState.SLAVE_ERROR_SOLENOID_SENSORS) { // other errors
- setChargeState(MSChargeState.NotCharging);
- Middleware.getInstance().sendEvent(new Event(DockingStation.ERROR_DOCKING_POINT));
- } else {
- if (_chargeState != MSChargeState.NotCharging) {
- setChargeState(MSChargeState.NotCharging);
- }
- if ((slavePCBDigitalInputStatus & 0x03) != 0x03) { // Bike is pushed in
- setCanUndock(false, CantUndockReason.BikeNotPushedIn);
- } else if (bikeStatus != BikeState.BIKE_DOCKING)
- setCanUndock(false, CantUndockReason.BikeNotDocked);
- } else {
- setCanUndock(true);
- }
- }
- } else {
- setBikeState(MSBikeState.Docked);
- setSlaveUnavailable(true);
- setCanUndock(false);
- }
- }
- private void assertCharging(BikePCB.BikeState bikeStatus, DockingStation.SlaveState slaveStatus) {
- setChargeState(MSChargeState.Charging);
- if (bikeStatus == BikeState.BIKE_DOCKING) {
- setChargeState(MSChargeState.ChargingError);
- }
- if (slaveStatus == SlaveState.SLAVE_UNCONDITIONAL_CHARGING_START ||
- slaveStatus == SlaveState.SLAVE_UNCONDITIONAL_CHARGING_4H5 ||
- slaveStatus == SlaveState.SLAVE_UNCONDITIONAL_CHARGING_2H5 ||
- slaveStatus == SlaveState.SLAVE_UNCONDITIONAL_CHARGING_1H5 ||
- slaveStatus == SlaveState.SLAVE_UNCONDITIONAL_CHARGING_0H5 || // Uncond_Charging
- slaveStatus == SlaveState.SLAVE_TABLET_BOOTUP) {
- if (_chargeState != MSChargeState.UnconditionalCharging) {
- setChargeState(MSChargeState.UnconditionalCharging);
- }
- } else {
- if (_chargeState == MSChargeState.UnconditionalCharging) {
- setChargeState(MSChargeState.NotCharging);
- }
- }
- }
- private void assertDocking() {
- if (_bikeState == MSBikeState.Docked) {
- setBikeState(MSBikeState.Docked);
- setCanUndock(true);
- }
- }
- private void debugState(String msg) {
- BufferedLog.log().w(TAG,
- "[Line "+Thread.currentThread().getStackTrace()[4].getLineNumber()+"] "+
- "State not considered ("+msg+")");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement