コード例 #1
0
        /// <summary>
        /// Called when the receiver reports data from a device indicating a hit has registered.
        /// We need to update the scorekeeper service if a game is in progress.
        /// </summary>
        /// <param name="deviceData">The sensor impact data.</param>
        protected void OnSensorHit(DeviceDataEventArgs deviceData)
        {
            CompetitorModel competitor = this.ScoreKeeperService.Competitors.FirstOrDefault(c => c.DeviceId.Equals(deviceData.DeviceId));
            if (competitor != null)
            {
                byte impactLevel = Math.Max(deviceData.HeadHitValue, deviceData.VestHitValue);

                // If we are in partnering mode, we need to flip to award score/impact to the correct person
                if (competitor.HasPartner) competitor = competitor.Partner;

                competitor.LastImpactLevel = impactLevel;

                if (!this.StopWatchService.IsRunning && this.StopWatchService.DisplayTime == this.StopWatchService.Duration)
                {
                    competitor.Score = competitor.HighestImpactLevel;
                }
                else if (this.StopWatchService.IsRunning && impactLevel >= competitor.RequiredImpactLevel)
                {
                    competitor.Score += 1; // TODO: Allow configurable points
                    this.Logger.Log("KickAndPunch score for " + competitor.DisplayName + " is now " + competitor.Score, Category.Info, Priority.Low);
                }
            }
        }
コード例 #2
0
 /// <summary>
 /// Raises the <see cref="E:HitReceived"/> event.
 /// </summary>
 /// <param name="sender">The sender.</param>
 /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Entities.DeviceDataEventArgs"/> instance containing the event data.</param>
 protected virtual void OnStrikeDetected(object sender, DeviceDataEventArgs e)
 {
     EventHandler<DeviceDataEventArgs> handler = this.StrikeDetected;
     try
     {
         handler(this, e);
     }
     catch (Exception ex)
     {
         Trace.TraceError("{0}.OnStrikeDetected: {1}", CLASSNAME, ex.GetBaseException());
         throw;
     }
 }
コード例 #3
0
ファイル: Receiver.cs プロジェクト: bradsjm/LaJustPowerMeter
        /// <summary>
        /// Processes the strike received for V2 receiver (EIDSS 3.0)
        /// </summary>
        /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Hardware.DataPacketReceivedEventArgs"/> instance containing the event data.</param>
        /// <returns>Device Event Data</returns>
        private DeviceDataEventArgs Process_TargetDataReceivedV2(DataPacketReceivedEventArgs e)
        {
            // Generate acknowledgement packet and send to receiver
            this.receiverComm.SendDataPacket(new byte[3] 
            {
                e.DataPacket[(int)TargetDataFieldsV2.GameNumber], 
                (byte)OpCodeCmds.Acknowledgement, 
                e.DataPacket[(int)TargetDataFieldsV2.SequenceNumber] 
            });

            // Parse data packet
            DeviceDataEventArgs deviceData = new DeviceDataEventArgs()
            {
                ReceiverId = this.Id,
                GameNumber = e.DataPacket[(byte)TargetDataFieldsV2.GameNumber],
                OperationCode = (OpCodes)e.DataPacket[(byte)TargetDataFieldsV2.OpCode],
                RegistrationSequence = e.DataPacket[(byte)TargetDataFieldsV2.RegSequence],
                VestHitValue = e.DataPacket[(byte)TargetDataFieldsV2.VestHitValue],
                HeadHitValue = e.DataPacket[(byte)TargetDataFieldsV2.HeadHitValue],

                // Remove "touch sensor" bit from wet bag panel byte by AND with 0x77 (0111 0111)
                WetBagPanel = (WetBagPanelEnum)(e.DataPacket[(byte)TargetDataFieldsV2.TargetPanel] & 0x77),

                // Determine "touch sensor" bit from wet bag panel byte by checking 0x08 or 0x80 bits
                TouchStatus = (((e.DataPacket[(byte)TargetDataFieldsV2.TargetPanel] & 0x08) == 0x08) ||
                               ((e.DataPacket[(byte)TargetDataFieldsV2.TargetPanel] & 0x80) == 0x80)) ?
                               TouchSensorStatusEnum.Required : TouchSensorStatusEnum.NotRequired,
                DeviceStatus = (DeviceStatusEnum)e.DataPacket[(byte)TargetDataFieldsV2.TargetStatus],
                DeviceId = new DeviceId(e.DataPacket[(byte)TargetDataFieldsV2.ID1], e.DataPacket[(byte)TargetDataFieldsV2.ID2], e.DataPacket[(byte)TargetDataFieldsV2.ID3]),
                SequenceNumber = e.DataPacket[(byte)TargetDataFieldsV2.SequenceNumber],
                TargetNumber = e.DataPacket[(byte)TargetDataFieldsV2.TargetNumber],
                TargetTotal = e.DataPacket[(byte)TargetDataFieldsV2.TargetTotal]
            };

            return deviceData;
        }
コード例 #4
0
ファイル: Receiver.cs プロジェクト: bradsjm/LaJustPowerMeter
        /// <summary>
        /// Processes the strike received for V2 receiver (EIDSS 3.0)
        /// </summary>
        /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Hardware.DataPacketReceivedEventArgs"/> instance containing the event data.</param>
        /// <returns>Device Event Data</returns>
        private DeviceDataEventArgs Process_HoguDataReceivedV2(DataPacketReceivedEventArgs e)
        {
            // Generate acknowledgement packet and send to receiver
            this.receiverComm.SendDataPacket(new byte[3] 
            {
                e.DataPacket[(byte)HoguDataFieldsV2.GameNumber], 
                (byte)OpCodeCmds.Acknowledgement, 
                e.DataPacket[(byte)HoguDataFieldsV2.SequenceNumber] 
            });

            // Parse data packet
            DeviceDataEventArgs deviceData = new DeviceDataEventArgs()
            {
                ReceiverId = this.Id,
                GameNumber = e.DataPacket[(byte)HoguDataFieldsV2.GameNumber],
                OperationCode = (OpCodes)e.DataPacket[(byte)HoguDataFieldsV2.OpCode],
                RegistrationSequence = e.DataPacket[(byte)HoguDataFieldsV2.RegSequence],
                VestHitValue = e.DataPacket[(byte)HoguDataFieldsV2.VestHitValue],
                HeadHitValue = e.DataPacket[(byte)HoguDataFieldsV2.HeadHitValue],
                TouchStatus = (TouchSensorStatusEnum)e.DataPacket[(byte)HoguDataFieldsV2.TouchStatus],
                DeviceStatus = (DeviceStatusEnum)e.DataPacket[(byte)HoguDataFieldsV2.HoguStatus],
                DeviceId = new DeviceId(e.DataPacket[(byte)HoguDataFieldsV2.ID1], e.DataPacket[(byte)HoguDataFieldsV2.ID2], e.DataPacket[(byte)HoguDataFieldsV2.ID3]),
                SequenceNumber = e.DataPacket[(byte)HoguDataFieldsV2.SequenceNumber]
            };

            return deviceData;
        }
コード例 #5
0
ファイル: Receiver.cs プロジェクト: bradsjm/LaJustPowerMeter
        /// <summary>
        /// Processes the strike received for version 1 receiver (EIDSS 2.0)
        /// </summary>
        /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Hardware.DataPacketReceivedEventArgs"/> instance containing the event data.</param>
        /// <returns>Device Event Data</returns>
#if EIDSS2
        private DeviceDataEventArgs Process_HoguDataReceivedV1(DataPacketReceivedEventArgs e)
        {
            // Generate acknowledgement packet and send to receiver
            this.receiverComm.SendDataPacket(new byte[3] 
            {
                e.DataPacket[(byte)HoguDataFieldsV1.GameNumber], 
                (byte)OpCodeCmds.Acknowledgement, 
                e.DataPacket[(byte)HoguDataFieldsV1.SequenceNumber] 
            });

            // Parse data packet
            DeviceDataEventArgs deviceData = new DeviceDataEventArgs()
            {
                ReceiverId = this.Id,
                GameNumber = e.DataPacket[(byte)HoguDataFieldsV1.GameNumber],
                OperationCode = (OpCodes)e.DataPacket[(byte)HoguDataFieldsV1.OpCode],
                RegistrationSequence = e.DataPacket[(byte)HoguDataFieldsV1.RegSequence],
                VestHitValue = e.DataPacket[(byte)HoguDataFieldsV1.VestHitValue],
                HeadHitValue = e.DataPacket[(byte)HoguDataFieldsV1.HeadHitValue],
                TouchStatus = (TouchSensorStatusEnum)e.DataPacket[(byte)HoguDataFieldsV1.TouchStatus],
                DeviceStatus = (DeviceStatusEnum)e.DataPacket[(byte)HoguDataFieldsV1.HoguStatus],
                SequenceNumber = e.DataPacket[(byte)HoguDataFieldsV1.SequenceNumber]
            };

            // Insert device Id information we stored during registration as V1 data packet does not include it
            switch (deviceData.OperationCode)
            {
                case OpCodes.ChungDataV1:
                    deviceData.DeviceId = this.chungDeviceId;
                    break;

                case OpCodes.HongDataV1:
                    deviceData.DeviceId = this.hongDeviceId;
                    break;
            }

            return deviceData;
        }
コード例 #6
0
ファイル: Receiver.cs プロジェクト: bradsjm/LaJustPowerMeter
        /// <summary>
        /// Publish the event data.
        /// </summary>
        /// <param name="deviceData">The device data.</param>
        private void Publish_EventData(DeviceDataEventArgs deviceData)
        {
            // Check for duplicate packet
            if (deviceData.SequenceNumber == this.lastSeqNumber)
            {
                return;
            }
            else
            {
                this.lastSeqNumber = deviceData.SequenceNumber;
            }

            // Validate known device Id
            if (!deviceData.DeviceId.IsValid() || !this.deviceRegistrations.ContainsKey(deviceData.DeviceId))
            {
                Trace.TraceWarning("{0}.Process_EventData: Unknown device id. ID={1}", CLASSNAME, deviceData.DeviceId);
                return;
            }

            // Validate registration sequence
            if (this.deviceRegistrations[deviceData.DeviceId].RegistrationSequence != deviceData.RegistrationSequence)
            {
                Trace.TraceWarning("{0}.Process_EventData: Incorrect registration sequence. ID={1} Expected={2} Actual={3}", CLASSNAME, deviceData.DeviceId, this.deviceRegistrations[deviceData.DeviceId], deviceData.RegistrationSequence);
                return;
            }

            // Trace/Debug Information (only if we have listeners)
            if (Trace.Listeners.Count > 0)
            {
                Trace.TraceInformation(
                    "{0}.Process_EventData: OpCode={1} Match={2} RegSeq={3} VestHit={4} HeadHit={5} Touch={6} Status={7} Id={8} TgtNum={9} TgtTot={10} Panel={11} Seq={12}",
                    CLASSNAME,
                    deviceData.OperationCode,
                    deviceData.GameNumber,
                    deviceData.RegistrationSequence,
                    deviceData.VestHitValue,
                    deviceData.HeadHitValue,
                    deviceData.TouchStatus,
                    deviceData.DeviceStatus,
                    deviceData.DeviceId,
                    deviceData.TargetNumber,
                    deviceData.TargetTotal,
                    deviceData.WetBagPanel,
                    deviceData.SequenceNumber);
            }

            // Send device status update event
            ThreadPool.QueueUserWorkItem(delegate
            {
                this.OnDeviceStatusUpdate(new DeviceStatusEventArgs() { ReceiverId = this.Id, DeviceId = deviceData.DeviceId, DeviceStatus = deviceData.DeviceStatus });
            });

            // If the pressure of head or vest is greater than zero send a strike impact event
            if (deviceData.HeadHitValue > 0 || deviceData.VestHitValue > 0)
            {
                // code to software patch sensor issue 12/19/09
                if (deviceData.WetBagPanel == WetBagPanelEnum.BottomMiddle)
                {
                    deviceData.VestHitValue = (byte)((double)deviceData.VestHitValue * 1.20);
                }

                ThreadPool.QueueUserWorkItem(delegate
                {
                    this.OnStrikeDetected(deviceData);
                });
            }
        }