Esempio n. 1
0
        /// <summary>
        /// Keep the FW watchdog alive by continuously retrieving sensor+encoder values
        /// </summary>
        /// <param name="dt">A instance of type DateTime</param>
        /// <returns>A instance of IEnumerator of type ITask</returns>
        private IEnumerator <ITask> PollSensors(DateTime dt)
        {
            try
            {
                soap.Fault           fault         = null;
                adc.ADCPinArrayState pinArrayState = null;

                adc.Get adcGet = new adc.Get();

                this.controllerAdcPinArrayPort.Post(adcGet);

                yield return(adcGet.ResponsePort.Choice());

                fault = (soap.Fault)adcGet.ResponsePort;

                if (fault != null)
                {
                    LogError(string.Format("Fault on getting ADCPinArray state: {0}", fault.Detail));
                    throw fault.ToException();
                }

                pinArrayState = (adc.ADCPinArrayState)adcGet.ResponsePort;

                for (int i = 0; i < this.state.InfraredSensorState.Sensors.Count; i++)
                {
                    adc.ADCPinState pinState = pinArrayState.Pins[this.state.InfraredSensorState.Sensors[i].HardwareIdentifier];

                    this.state.InfraredSensorState.Sensors[i].DistanceMeasurement = this.state.InfraredRawValueDivisorScalar * Math.Pow(pinState.PinValue, this.state.InfraredDistanceExponent) / CentimetersPerMeter;
                }

                for (int i = 0; i < this.state.SonarSensorState.Sensors.Count; i++)
                {
                    adc.ADCPinState pinState = pinArrayState.Pins[this.state.SonarSensorState.Sensors[i].HardwareIdentifier];

                    this.state.SonarSensorState.Sensors[i].DistanceMeasurement = pinState.PinValue * this.state.SonarTimeValueMultiplier / CentimetersPerMeter;
                }

                this.state.BatteryState.PercentBatteryPower = (pinArrayState.Pins[this.state.BatteryVoltagePinIndex].PinValue * this.state.BatteryVoltageDivider) / this.state.BatteryState.MaxBatteryPower * 100.0;

                if (this.state.BatteryState.PercentBatteryPower <= this.state.BatteryState.PercentCriticalBattery)
                {
                    battery.BatteryNotification batteryNotification = new battery.BatteryNotification(
                        (int)this.state.BatteryState.MaxBatteryPower,
                        this.state.BatteryState.PercentBatteryPower);

                    this.SendNotification <battery.Replace>(this.submgrBatteryPort, batteryNotification);
                }
            }
            finally
            {
                // Ensure we haven't been droppped
                if (ServicePhase == ServiceRuntimePhase.Started)
                {
                    // Issue another polling request
                    Activate(TimeoutPort(this.state.SensorPollingInterval).Receive(this.sensorPollingPort.Post));
                }
            }

            yield break;
        }
Esempio n. 2
0
 public void AdcGetHandler(adc.Get get)
 {
     get.ResponsePort.Post(this.state.AdcState);
 }