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: "); }