public virtual IEnumerator<ITask> ReplaceHandler(Replace replace)
		{
            LogInfo("TrackRoamerBrickPowerService:ReplaceHandler()");

			Close();
			
            _state = replace.Body;
			_state.Connected = false;
			_state.Connected = ReConnect();
            _state.TimeStamp = DateTime.Now;
            
            replace.ResponsePort.Post(DefaultReplaceResponseType.Instance);
			yield break;
		}
		protected override void Start()
        {
            LogInfo("TrackRoamerBrickPowerService:Start() _state=" + _state);

            if (_state == null)
            {
                // we usually don't come here, as the state is already configured by file - TrackRoamer.TrackRoamerBrickPower.Bot.Config.xml

                LogInfo("TrackRoamerBrickPowerService:Start(): _state == null - initializing...");

                _state = new TrackRoamerBrickPowerState();
                _state.PowerControllerConfig = new PowerControllerConfig();
                _state.PowerControllerConfig.CommPort = DEFAULT_COM_PORT_NUMBER;
                _state.Connected = false;
                _state.FrameCounter = 0;
                _state.Whiskers = new Whiskers();
                _state.MotorSpeed = new MotorSpeed();
                _state.MotorEncoder = new MotorEncoder();
                _state.MotorEncoderSpeed = new MotorEncoderSpeed();
                _state.TimeStamp = DateTime.Now;

                SaveState(_state);
            }
            else
            {
                LogInfo("TrackRoamerBrickPowerService:Start(): _state is supplied by file: " + _configFile);
            }

            if (_state.PowerControllerConfig == null)
            {
                _state.PowerControllerConfig = new PowerControllerConfig();
            }

            _brickConnection = new BrickConnection(_state.PowerControllerConfig, _rbtqDataPort, this);

            // wireup all event handlers to receive AX2850 data:
            _brickConnection.onValueReceived_EncoderLeftAbsolute += new OnValueReceived(_brickConnection_onValueReceived_EncoderLeftAbsolute);
            _brickConnection.onValueReceived_EncoderRightAbsolute += new OnValueReceived(_brickConnection_onValueReceived_EncoderRightAbsolute);

            _brickConnection.onValueReceived_EncoderSpeed += new OnValueReceived(_brickConnection_onValueReceived_EncoderSpeed);

            _brickConnection.onValueReceived_WhiskerLeft += new OnValueReceived(onWhiskerLeft);
            _brickConnection.onValueReceived_WhiskerRight += new OnValueReceived(onWhiskerRight);

            _brickConnection.onValueReceived_AnalogInputs += new OnValueReceived(_brickConnection_onValueReceived_AnalogInputs);
            _brickConnection.onValueReceived_DigitalInputE += new OnValueReceived(_brickConnection_onValueReceived_DigitalInputE);
            _brickConnection.onValueReceived_Voltage += new OnValueReceived(_brickConnection_onValueReceived_Voltage);
            _brickConnection.onValueReceived_MotorPower += new OnValueReceived(_brickConnection_onValueReceived_MotorPower);
            _brickConnection.onValueReceived_MotorAmps += new OnValueReceived(_brickConnection_onValueReceived_MotorAmps);
            _brickConnection.onValueReceived_HeatsinkTemperature += new OnValueReceived(_brickConnection_onValueReceived_HeatsinkTemperature);

            base.Start();   // start MainPortInterleave; wireup [ServiceHandler] methods

            SpawnIterator(ConnectToPowerController);

            MainPortInterleave.CombineWith(
            Arbiter.Interleave(
                new TeardownReceiverGroup(),
                new ExclusiveReceiverGroup(
                                        Arbiter.ReceiveWithIterator(true, _controlPort, ControlLoop),
                                        Arbiter.Receive<Exception>(true, _rbtqDataPort, ExceptionHandler),
                                        Arbiter.Receive<string>(true, _rbtqDataPort, MessageHandler)
                                        ),
                new ConcurrentReceiverGroup()));

            // kick off control loop interval:
            _controlPort.Post(DateTime.UtcNow);
            lastRateSnapshot = DateTime.Now.AddSeconds(frameRateWatchdogDelaySec);     // delay frame rate watchdog
            LogInfo("OK: TrackRoamerBrickPowerService:ControlLoop activated");

			// display HTTP service Uri
            LogInfo("TrackRoamerBrickPowerService: Service uri: ");
		}