public TelemetryReceivedEventArgs(TelemetryFeedback telemetry)
        {
            if(telemetry == null)
                throw new ArgumentNullException("telemetry");

            this.telemetry = telemetry;
        }
        void reporter_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (System.Threading.Monitor.TryEnter(reporterSync)) //re-entrace protection
            {
                try
                {
                    //compile all data
                    Comms.TelemetryEncoding.TelemetryFeedback feedback = new Comms.TelemetryEncoding.TelemetryFeedback()
                    {
                        // Voltages
                        DriveBatteryVoltage = this.DriveBatteryVoltage,
                        CleanBatteryVoltage = this.CleanBatteryVoltage,
                        PowerUsed = this.PowerUsed,

                        // Mining
                        ArmMotorAmps = this.BeltMotorAmps,
                        ScoopPitchAngle = this.BucketPitchAngle,
                        ArmSwingAngle = this.BucketPivotAngle,
                        ScoopLowerLimitSwitchDepressed = this.pivotLowerLimitSwitchDepressed,
                        ScoopUpperLimitSwitchDepressed = this.pivotUpperLimitSwitchDepressed,

                        // Deposition
                        BinLeftMotorAmps = 12,
                        BinRightMotorAmps = 12,
                        BinLowerSwitchDepressed = this.binLowerLimitSwitch,
                        BinUpperSwitchDepressed = this.binUpperLimitSwitch,

                        // Sensory
                        TiltX = tiltX,
                        TiltY = tiltY,
                        RearProximityLeft = rearProximityLeft,
                        RearProximityRight = rearProximityRight,

                        // Localization
                        X = this.X,
                        Y = this.Y,
                        Psi = this.Psi,
                        Confidence = this.Confidence,
                        State = this.State
                    };

                    //todo : store rf timing in telemetry
                    int timing;

                    if (front_rf != null)
                        feedback.FrontRangeFinderData = front_rf.CopyData(null, out feedback.FrontRangeFinderDataLength, out timing);

                    if (rear_rf != null)
                        feedback.RearRangeFinderData = rear_rf.CopyData(null, out feedback.RearRangeFinderDataLength, out timing);

                    // Raise event for telemetry processed
                    OnTelemetryFeedbackProcessed(new TelemetryFeedbackArgs(feedback));

                    //send
                    udp_sender.Send(feedback.Encode());
                }
                catch (TimeoutException ex)
                {
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    System.Threading.Monitor.Exit(reporterSync);
                }
            }
        }